Perl概覽
Perl最早由Larry Wall開發,是一種“膠水”語言,例如將上一個程式的輸出做簡單處理,轉換為下一個程式的輸入。第一版Perl發佈於1987年12月18日,然後一直穩步升級,直到Perl 5. Perl 5是一個大升級,包含了一些對於Perl 4舊有文法的改進。該書寫作之時的Perl版本是5.10.1。Perl仍在不斷升級中,下一個大版本是Perl 6,Perl 6是全部重寫的Perl實現,與之前的版本不同,完全由社區貢獻代碼。
Perl的宗旨是“不止一種做法”(TMTOWTDI, There’s More Than One Way To Do It.)。具有以下優點:
- 易於學習
- 代碼可讀性好
- 可移植(portable)
- 善於進行文本處理
- Perl是高層語言(high-level language),無需像C/C++考慮諸多細節
第1章:初識PerlHello, World!
第一個Perl程式(helloworld.pl):
#!/usr/bin/perluse warnings;print "Hello, world!\n";
Perl將源碼中#之後到行尾的內容視為注釋。而在Linux/Unix中,#!program表示由program處理該文字檔,因此首行寫#!/usr/bin/perl表示該檔案由/usr/bin/perl處理,若該檔案有+x許可權,則執行./helloworld.pl等同於執行perl helloworld.pl
開啟警告資訊
在源碼開始處聲明
use warnings;
或以-w參數調用perl運行.pl源碼均可開啟警告資訊
調試
使用perl –d運行.pl可以調試
第2章:標量
Perl中的標量(scalar)是指單個的單一資料型別,例如整數、浮點數、字串。字面量(literal)是一個常量,例如5. 變數是可以重賦值的標識符,所有變數以$開頭,例如$number。
數字
- Perl中可以用底線為數字分段,例如10,000,000可以寫作10_000_000
- 十進位數直接寫,0開頭八進位,0b開頭二進位,0x開頭十六進位
字串
- 單引號對’’/雙引號對””均可表示字串,區別是單引號對中的字串不處理轉義符(’除外,\’表示’),例如print '\tThis is a single-quoted string.\n'; 輸出\tThis is a single-quoted string.\n而雙引號對中的字串處理轉義符。
- 也可以用q//和qq//表示字串(兩/間為字串內容),q//相當於單引號寫法,qq//相當於雙引號寫法。除/外可以使用任何非字元、非數位字元,例如|、#. 除此之外還可以使用{}、[]、()、<>這四種符號對。
- 可以用就地文檔(here-document)在代碼中包含大量文本。就地文檔的格式是:
<<label
文檔內容
label
其中label可以是EOF或是EOT. 文檔內容按照雙引號寫法的字串內容處理。通常有字串過長有多行時可用就地文檔聲明,例如:
print <<EOF;This is a here-document. It starts on the line after the two arrows,and it ends when the text following the arrows is found at the beginningof a line, like this:EOF
- 數字/字串轉換
- "0.25" * 4的值為1
- hex()函數將十六進位寫法的數值字串轉換為Number類型
- oct()解析八進位寫法的數值字串
運算子
- +、-、*、/、++、--、(、)、&、|、^、~、==、!=、&&、||、!、=、,同C/C++、Java
- $a = $a <some operator> $b; 可以簡寫為$a <some operator>= $b; 例如$a=$a+$b可以寫作$a+=$b同C/C++、Java
- **是冪運算運算子,2**4=16
- Perl中以下值是布爾值false:0(數字0)、”0”(字串”0”)、””(Null 字元串)、Undefined、空表(empty list)
- <=>運算子:a<=>b比較a和b的大小,a大為1,相等為0,b大為-1
- 字串運算子:.為字串合并算符,”ba”.”nana”->”banana”
- 通過x可以進行字串乘法”ba”.(”na” x 2) ->”banana”
- ord()可取得一個字元的ASCII值,例如ord(“f”)->102
變數
- 變數範圍為當前代碼塊以及該代碼塊內的所有子塊。
- 通常情況下可任意聲明、賦值變數。但這樣存在一個問題,如果一開始聲明$foo = 4; 而後面寫成了$ofo = 7;會使得代碼工作不正確(而且還一下子發現不了)
- 可通過聲明use strict;讓Perl嚴格檢查變數使用。使用未定義/初始化的變數將會導致編譯錯誤。在strict模式下聲明變數必須使用my關鍵字,例如my $record;. 為了代碼規範易維護建議使用use strict
- 特殊變數:有一些特殊變數,例如$_代表了很多函數輸入、輸出的預設參數。關於特殊變數可參考perldoc perlvar
- 雙引號中可使用變數,變數將會被代換為其值。例如
my $name = "fred";my $salutation = "Dear $name,";print $salutation, "\n";
輸出
Dear fred,
標準輸入<STDIN>
- my $yen = <STDIN>;從STDIN中讀一次,每賦值一次就讀一次
- chomp()修改輸入參數的指定的字串,如果該串最後一次字元是分行符號,則將其去掉,如果不是則不做修改
- chop()函數移除輸入字串的最後一個字元
- chomp()和chop()直接修改輸入,無傳回值
兩個函數
- exit()用於退出,exit()等價於exit(0),正常退出。exit(1)為帶錯誤退出
- die()用於報錯退出,die接受一個字串參數,將其列印至STDERR然後exit(1)退出兩個函數
第3章:流程式控制制
- 與C/C++、Java相同的:
- if(){…}else(){…}
- for(init; cond; op){…}
- while(cond){…}
- do{…}while(cond)
- 無限迴圈while(1){…}
- 邏輯算符
- 字串比較算符:gt(>)、lt(<)、ge(>=)、le(<=)、eq(==)、ne(!=) 注意括弧內僅為注釋,不可替代通用
- defined($var)算符。如果$var已定義則為true,反之false.
- 可用and代替&&,or代替||,not代替!. 注意and/or/not的算符優先順序與&&/||/!不同
- if(){…}elseif(){…}elseif(){…}else(){…}可用於多分支流程式控制制
- unless(cond)等價於if(!cond)
- 可以將
if ($number == 0) {die "can't divide by 0";}
寫作
die "can't divide by 0" if $number == 0;
- until(cond){…}等價於while(!cond){…}
- foreach my $var list可用於使用變數$var遍曆列表list,例如foreach my $number (1 .. 10) {…}
- do{…}until(cond)等價於do{…}while(!cond)
- Perl中的last等於C/C++、Java中的break,next等於continue
- redo語句可以重啟迴圈,從迴圈開始處執行。注意redo重啟迴圈對於for和while/until並不進行條件檢查,而是直接從頭開始執行迴圈(個人理解,就是在next的基礎上去掉條件檢查)
- 迴圈標記。預設last、next、redo僅僅對所在的那一層迴圈有效。如果想跳至外層則需要使用標記:
OUTER: while ($i <= 5) {my $j = 1;while ($j <= 5) {last OUTER if $j == 3;print "$i ** $j = ", $i ** $j, "\n";$j++;}$i++;}