2012年9月26日 星期三

Perl 教學 -- 簡單的 Perl 程式

Perl 教學 -- 簡單的 Perl 程式

This tutorial is copyrighted and provided as is and can be used as supplement to any CGI tutorial materials such as Common Gateway Interface, written by 網際工作室(Internet Studio). You are welcomed to use it for non-commercial purpose.
Written by: 國立中興大學資管系呂瑞麟 Eric Jui-Lin Lu

請勿轉貼
看其他教材

一些簡單的 Perl 程式

首先讓我們先了解一些簡單的 Perl 語法;讀者可以將下列程式碼 儲存成一個檔案,然後在"命令提示字元"內執行。
  • Hello World:將連結內的原始碼儲存為(例如) hello.pl,然後請在"命令提示字元"內輸入 perl hello.pl 來執行。執行後的畫面如下:
    這個程式碼中真正的 Perl 程式敘述只有一行,也就是包含 print 的 那一行敘述,它的目的就是將字串輸出到標準輸出裝置,也就是螢幕;如果 你把這個程式經由 mod_perl 處理,print 會將字串從 Apache 傳回給瀏覽器,並由瀏覽器呈現。
  • 解 ax2 + bx + c = 0 (I):在這個 程式,我們首先宣告了三個變數 a、b、和 c。經由 Perl 提供的方法函數 sqrt(),程式計算了 b2 - 4ac 的平方根,並將結果 指定給變數 tmp;最後,計算兩個解並將結果列印出來。
  • 解 ax2 + bx + c = 0 (II):這是 解方程式的另一個版本,由於使用了 <STDIN> 來讀取使用者 輸入的資料,因此這個程式不能經由 mod_perl 執行。除此之外,這個程式還有 一些值得說明的:
    • chomp():由於使用者輸入數字之後需要按"Enter"鍵,因此變數 a、b、和 c 內的字串最後都有"跳行"的控制字元;因此我們需要使用 chomp() 把"跳行"的控制字元去除。
    • 狀態 || 敘述:這個敘述的意思是"如果狀態為 false,則執行 || 後的敘述。
    • die 的用法是將其後面的字串顯示出來之後,把程式結束掉。




格式化輸出

#!/usr/local/bin/perl
$s = "My name is Eric.";
$n = 5400;
$r = 123.456;

// 結果是 "My Name is Eric ^5400 ^^^^123.46"
printf "%15s %5d %10.2f\n", $s, $n, $r;
如果希望把 123.46 這項結果指定給另一個變數呢?
$newr = sprintf("%.2f", $r);

資料結構

  1. 變數: $input 是一個變數。 一個變數可以包含數字或字串。 你可以利用適當的 operators 去處理變數, 試試看這個例子:
      #!/usr/local/bin/perl
      $str = "th Perl";
      $str .= " CGI program.\n";
      $num = 1;
      $num++;
      $num += 1;
      $num = $num + 1;
      print "My $num$str";
      
  2. 陣列 (array) 或 串列 (list): @addr 代表一個陣列。
      @addr = ("www.cyut.edu.tw", 80, "/~jlu/");
      print "http://$addr[0]$addr[2]\n";  # @addr and $addr
      
      常用的陣列函示:
    1. split(/pattern/, $line)
          $addr = "www.cyut.edu.tw";
          @tmp = split(/\./, $addr);   # 以後討論
          print '$tmp[2] is ', $tmp[2], "\n";
          
      練習: 若 $time = "18:30:32";, 請將結果 「下午6點30分32秒」印出。
  3. Hash (雜湊): 舊稱結合陣列 (associative array): %url 代表一個 Hash。 一>個 Hash 是一群 (key, value) 組合而成的陣列。 例如在前一個例子中, address 是 www.cyut.edu.tw, port 是 80, 而 path 是 /~jlu/, 因此 %url 可定義為
           $url{"address"} = "www.cyut.edu.tw";
           $url{"port"} = 80;
           $url{"path"} = "/~jlu/";
           
      常用的 Hash 函示:
    1. keys(%array): 傳回 %array 的所有鍵。
    2. values(%array): 傳回 %array 的所有值。
    3. each(%array): 一次傳回一對鍵與值。
  4. Hash and Array:
      # @url_list gets (key1, value1, key2, value2, ...)
      @url_list = %url;
    
      # create %newurl like %url
      %newurl = @url_list;
    
      # easier and faster.
      %newurl = %url;       # easier and faster.
      
  5. Name: $eric, @eric, %eric 雖然使用同樣的名稱, 但是對 Perl 而言, 他們代表完全不同的意義。 縱使 Perl 能分辨出他們的不同, 在寫程式 我們不鼓勵這樣做。
      $eric = "Eric";
      @eric = ("Hello", "Carol");
      %eric = ("Last Name", "Lu", "First Name", "Eric");
      @tmp = keys(%eric);
    
      print '$eric is ', $eric, "\n";;
      print '@eric[1] is ', $eric[1], "\n";
      print '$eric{"First Name"} is ',
            $eric{"First Name"}, "\n";
      print '$eric{$tmp[0]} is ',
            $eric{$tmp[0]}, "\n";
      

控制結構:

  1. if 敘述: if 敘述的括號 ({}) 不能省略。 如果 condition 是空字串, 0 (zero), 或 "0" (零字串), 則結果為偽。 其餘為真。
    1. if (condition) { statements; }
    2. if (condition) { statements; } else { statements; }
    3. if (condition) { statements; } elsif { statements; } else { statements; }
    字串比較的運算子有: eq, lt, gt, le, ge, and ne。 相對的數值運算子有: ==, <, >, <=, >=, !=。
  2. while 敘述: while (condition) { statements; }
  3. do-while 敘述: do { statements; } while (condition);
  4. for 敘述: for( initial_exp; test_exp; re-init_exp ) { statements; }
  5. foreach $i ( @array ) { statements; }

控制結構與資料結構的例題:

  1. 例題 I:
      if ($url{"address"} eq "www.cyut.edu.tw")
      {
        print "You're pointing to CYUT.\n";
      }
    
      if ($url{"port"} == 80)
      {
        print "Port is 80.\n";
      }
      else
      {
        print "Wrong port number.\n";
      }
      
  2. 例題 II:
      foreach $key (keys(%url))
      {
        print "key is $key.\n";
      }
      
  3. 例題 III:
      while (($key, $value) = each(%url))
      {
        print "$key is $value.\n";
      }
      
  4. 例題 IV:
      # if there are 6 elements in @url_list, when @url_list
      # compares with an integer, it will return 6.
      for ( $i = 0; $i < @url_list; $i++)
      {
        print "$url_list[$i] ";
      }
      print "\n";
    
      # $#addr: size of addr - 1
      for ( $i = 0; $i <= $#addr; $i++ )
      {
         print "$addr[$i]\n";
      }
      

Written by: 國立中興大學資管系呂瑞麟 Eric Jui-Lin Lu

沒有留言:

張貼留言