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 語法;讀者可以將下列程式碼 儲存成一個檔案,然後在"命令提示字元"內執行。

格式化輸出

#!/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";
      }
      

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