




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第一章 概述 一、Perl是什么? Perl是Practical Extraction and Report Language的縮寫,它是由Larry Wall設(shè)計的,并由他不斷更新和維護,用于在UNIX環(huán)境下編程。 .Perl具有高級語言(如C)的強大能力和靈活性。事實上,你將看到,它的許多特性是從C語言中借用來的。 .與腳本語言一樣,Perl不需要編譯器和鏈接器來運行代碼,你要做的只是寫出程序并告訴Perl來運行而已。這意味著Perl對于小的編程問題的快速解決方案和為大型事件創(chuàng)建原型來測試潛在的解決方案是十分理想的。 .Perl提供腳本語言(如sed和awk)的所有功能,還具有它們所不具備
2、的很多功能。Perl還支持sed到Perl及awd到Perl的翻譯器。 簡而言之,Perl象C一樣強大,象awk、sed等腳本描述語言一樣方便。 二、Perl在哪里? Perl通常位于/usr/local/bin/perl或/usr/bin/perl中。你可以在Internet用匿名FTP免費得到它,如/pub/gnu/perl-5.004.tar.gz。 安裝過程為: (1)解壓: $gunzip perl-5.004.tar.gz $tar xvf - perl-5.004.tar.gz (2)編譯: $make makefile (3)放置: 將編譯生成的可執(zhí)行文件拷貝到可執(zhí)行文件通常所
3、在目錄,如: $copy /usr/local/bin/perl 注:這需要系統(tǒng)管理員權(quán)限。 【編者注】在Windows 下運行perl程序,需安裝Active Perl, Active Perl 可以在Activestate公司的網(wǎng)頁下載。 HYPERLINK /ASPN/Downloads/ActivePerl/index/ t _blank /ASPN/Downloads/ActivePerl/index/ 三、運行 用文本編輯器編輯好你的Perl程序,加上可執(zhí)行屬性:$chmod +x 就可以執(zhí)行了:$./。如果系統(tǒng)提示:/usr/local/bin/perl not found,則說
4、明你沒有安裝成功,請重新安裝。 注:你的程序的第一行必須為#!/usr/local/bin/perl(perl所在位置)。 四、注釋: 注釋的方法為在語句的開頭用字符#,如: # this line is a comment 注:建議經(jīng)常使用注釋使你的程序易讀,這是好的編程習慣。 第二章 簡單變量 基本上,簡單變量就是一個數(shù)據(jù)單元,這個單元可以是數(shù)字或字符串。 一、整型 1、整型 PERL最常用的簡單變量,由于其與其它語言基本相同,不再贅述。 例: $x = 12345; if (1217 + 116 = 1333) # statement block goes here 整型的限制: PER
5、L實際上把整數(shù)存在你的計算機中的浮點寄存器中,所以實際上被當作浮點數(shù)看待。在多數(shù)計算機中,浮點寄存器可以存貯約16位數(shù)字,長于此的被丟棄。整數(shù)實為浮點數(shù)的特例。 2、8進制和16進制數(shù) 8進制以0打頭,16進制以0 x打頭。 例:$var1 = 047; (等于十進制的39) $var2 = 0 x1f; (等于十進制的31) 二、浮點數(shù) 如 11.4 、 -0.3 、.3 、 3. 、 54.1e+02 、 5.41e03 浮點寄存器通常不能精確地存貯浮點數(shù),從而產(chǎn)生誤差,在運算和比較中要特別注意。指數(shù)的范圍通常為-309到+308。 例: #!/usr/local/bin/perl $va
6、lue = 9.01e+21 + 0.01 - 9.01e+21; print (first value is , $value, n); $value = 9.01e+21 - 9.01e+21 + 0.01; print (second value is , $value, n); $ program3_3 first value is 0 second value is 0.01 三、字符串 慣用C的程序員要注意,在PERL中,字符串的末尾并不含有隱含的NULL字符,NULL字符可以出現(xiàn)在串的任何位置。 . 雙引號內(nèi)的字符串中支持簡單變量替換,例如: $number = 11; $tex
7、t = This text contains the number $number.; 則$text的內(nèi)容為:This text contains the number 11. .雙引號內(nèi)的字符串中支持轉(zhuǎn)義字符 L、U、Q功能可以由E關(guān)閉掉,如: $a = TLHIS IS A ESTRING; # same as This is a STRING .要在字符串中包含雙引號或反斜線,則在其前加一個反斜線,反斜線還可以取消變量替換,如: $res = A quote and A backslash ; $result = 14; print (The value of $result is $r
8、esult.n)的結(jié)果為: The value of $result is 14. .可用nnn(8進制)或xnn(16進制)來表示ASCII字符,如: $result = 377; # this is the character 255,or EOF $result = xff; # this is also 255 .單引號字符串 單引號字符串與雙引號字符串有兩個區(qū)別,一是沒有變量替換功能,二是反斜線不支持轉(zhuǎn)義字符,而只在包含單引號和反斜線時起作用。單引號另一個特性是可以跨多行,如: $text = This is two lines of text ; 與下句等效: $text = Th
9、is is twonlines of textn; .字符串和數(shù)值的互相轉(zhuǎn)換 例1: $string = 43; $number = 28; $result = $string + $number; # $result = 71 若字符串中含有非數(shù)字的字符,則從左起至第一個非數(shù)字的字符,如: $result = hello * 5; # $result = 0 $result = 12a34 +1; # $result = 13 .變量初始值 在PERL中,所有的簡單變量都有缺省初始值:,即空字符。但是建議給所有變量賦初值,否則當程序變得大而復雜后,很容易出現(xiàn)不可預料且很難調(diào)試的錯誤。 第三章
10、 操作符 一、算術(shù)操作符 二、整數(shù)比較操作符 三、字符串比較操作符 四、邏輯操作符 五、位操作符 六、賦值操作符 七、自增自減操作符 八、字符串聯(lián)結(jié)和重復操作符 九、逗號操作符 十、條件操作符 十一、操作符的次序 一、算術(shù)操作符 :+(加)、-(減)、*(乘)、/(除)、*(乘冪)、%(取余)、-(單目負) (1)乘冪的基數(shù)不能為負,如 (-5) * 2.5 # error; (2)乘冪結(jié)果不能超出計算機表示的限制,如10 * 999999 # error (3)取余的操作數(shù)如不是整數(shù),四舍五入成整數(shù)后運算;運算符右側(cè)不能為零 (4)單目負可用于變量: - $y ; # 等效于 $y * -1
11、 二、整數(shù)比較操作符 Table 3.1. 整數(shù)比較操作符 操作符 描述 大于 = 等于 = 大于等于 != 不等于 比較,返回 1, 0, or -1 操作符結(jié)果為: 0 - 兩個值相等 1 - 第一個值大 1 - 第二個值大 三、字符串比較操作符 Table 3.2. 字符串比較操作符 操作符 描述 lt 小于 gt 大于 eq 等于 le 小于等于 ge 大于等于 ne 不等于 cmp 比較,返回 1, 0, or -1 四、邏輯操作符 邏輯或:$a | $b 或 $a or $b 邏輯與:$a & $b 或 $a and $b 邏輯非:! $a 或 not $a 邏輯異或:$a xor
12、 $b 五、位操作符 位與:& 位或:| 位非: 位異或: 左移:$x 2 注:不要將&用于負整數(shù),因為PERL將會把它們轉(zhuǎn)化為無符號數(shù)。 六、賦值操作符 Table 3.3. 賦值操作符 操作符 描述 = Assignment only += Addition and assignment -= Subtraction and assignment *= Multiplication and assignment /= Division and assignment %= Remainder and assignment *= Exponentiation and assignment &=
13、 Bitwise AND and assignment |= Bitwise OR and assignment = Bitwise XOR and assignment Table 3.4. 賦值操作符例子 表達式 等效表達式 $a = 1; none (basic assignment) $a -= 1; $a = $a - 1; $a *= 2; $a = $a * 2; $a /= 2; $a = $a / 2; $a %= 2; $a = $a % 2; $a *= 2; $a = $a * 2; $a &= 2; $a = $a & 2; $a |= 2; $a = $a | 2;
14、 $a = 2; $a = $a 2; .=可在一個賦值語句中出現(xiàn)多次,如: $value1 = $value2 = a string; .=作為子表達式 ($a = $b) += 3; 等價于 $a = $b; $a += 3; 但建議不要使用這種方式。 七、自增自減操作符 :+、-(與C+中的用法相同) .不要在變量兩邊都使用此種操作符:+$var- # error .不要在變量自增/減后在同一表達式中再次使用:$var2 = $var1 + +$var1; # error .在PERL中+可用于字符串,但當結(jié)尾字符為z、Z、9時進位,如: $stringvar = abc; $strin
15、gvar+; # $stringvar contains abd now $stringvar = aBC; $stringvar+; # $stringvar contains aBD now $stringvar = abz; $stringvar+; # $stringvar now contains aca $stringvar = AGZZZ; $stringvar+; # $stringvar now contains AHAAA $stringvar = ab4; $stringvar+; # $stringvar now contains ab5 $stringvar = bc
16、999; $stringvar+; # $stringvar now contains bd000 .不要使用-,PERL將先將字符串轉(zhuǎn)換為數(shù)字再進行自減 $stringvar = abc; $stringvar-; # $stringvar = -1 now .如果字符串中含有非字母且非數(shù)字的字符,或數(shù)字位于字母中,則經(jīng)過+運算前值轉(zhuǎn)換為數(shù)字零,因此結(jié)果為1,如: $stringvar = ab*c; $stringvar+; $stringvar = ab5c; $stringvar+; 八、字符串聯(lián)結(jié)和重復操作符 聯(lián)接: . 重復:x 聯(lián)接且賦值(類似+=): .= 例: $newstr
17、ing = potato . head; $newstring = t x 5; $a = be; $a .= witched; # $a is now bewitched 九、逗號操作符 其前面的表達式先進行運算,如: $var1 += 1, $var2 = $var1; 等價于 $var1 += 1; $var2 = $var1; 使用此操作符的唯一理由是提高程序的可讀性,將關(guān)系密切的兩個表達式結(jié)合在一起,如: $val = 26; $result = (+$val, $val + 5); # $result = 32 注意如果此處沒有括號則意義不同: $val = 26; $result
18、 = +$val, $val + 5; # $result = 27 十、條件操作符 與C中類似,條件?值1:值2,當條件為真時取值1,為假時取值2,如: $result = $var = 0 ? 14 : 7; $result = 43 + ($divisor = 0 ? 0 : $dividend / $divisor); PERL 5中,還可以在賦值式左邊使用條件操作符來選擇被賦值的變量,如: $condvar = 43 ? $var1 : $var2 = 14; $condvar = 43 ? $var1 = 14 : $var2 = 14; 建議: 1、當你不確定某操作符是否先執(zhí)行時
19、,一定要用括號明確之。 2、用多行、空格等方式提高程序的可讀性。第四章 列表和數(shù)組變量 一、列表 列表是包含在括號里的一序列的值,可以為任何數(shù)值,也可為空,如:(1, 5.3 , hello , 2),空列表:()。 注:只含有一個數(shù)值的列表(如:(43.2) )與該數(shù)值本身(即:43.2 )是不同的,但它們可以互相轉(zhuǎn)化或賦值。 列表例: (17, $var, a string) (17, 26 2) (17, $var1 + $var2) ($value, The answer is $value) 二、數(shù)組-列表的存貯 列表存貯于數(shù)組變量中,與簡單變量不同,數(shù)組變量以字符打頭,如: arr
20、ay = (1, 2, 3); 注: (1)數(shù)組變量創(chuàng)建時初始值為空列表:()。 (2)因為PERL用和$來區(qū)分數(shù)組變量和簡單變量,所以同一個名字可以同時用于數(shù)組變量和簡單變量,如: $var = 1; var = (11, 27.1 , a string); 但這樣很容易混淆,故不推薦。 1、數(shù)組的存取 .對數(shù)組中的值通過下標存取,第一個元素下標為0。試圖訪問不存在的數(shù)組元素,則結(jié)果為NULL,但如果給超出數(shù)組大小的元素賦值,則數(shù)組自動增長,原來沒有的元素值為NULL。如: array = (1, 2, 3, 4); $scalar = $array0; $array3 = 5; # now
21、 array is (1,2,3,5) $scalar = $array4; # now $scalar = null; $array6 = 17; # now array is (1,2,3,5,17) .數(shù)組間拷貝 result = original; .用數(shù)組給列表賦值 list1 = (2, 3, 4); list2 = (1, list1, 5); # list2 = (1, 2, 3, 4, 5) .數(shù)組對簡單變量的賦值 (1) array = (5, 7, 11); ($var1, $var2) = array; # $var1 = 5, $var2 = 7, 11被忽略 (2)
22、 array = (5, 7); ($var1, $var2, $var3) = array; # $var1 = 5, $var2 = 7, $var3 = (null) .從標準輸入(STDIN)給變量賦值 $var = ; array = ; # D為結(jié)束輸入的符號 2 、字符串中的方括號和變量替換 $var0 為數(shù)組var的第一個元素。 $var0 將字符轉(zhuǎn)義,等價于$var. 0,$var被變量替換,0保持不變。 $var0 亦等價于$var .0。 $var則取消了大括號的變量替換功能,包含文字:$var. 3、列表范圍: (1.10) = (1, 2, 3, 4, 5, 6, 7
23、, 8, 9, 10) (2, 5.7, 11) = (2, 5, 6, 7, 11) (3.3) = (3) .用于實數(shù) () = (2.1, 3.1 ,4.1, 5.1) () = () .用于字符串 (aaa.aad) = (aaa,aab, aac, aad) day_of_month = (01.31) .可包含變量或表達式 ($var1.$var2+5) .小技巧: $fred = Fred; print (Hello, . $fred . !n) x 2); 其結(jié)果為: Hello, Fred! Hello, Fred! 4、數(shù)組的輸出: (1) ar
24、ray = (1, 2, 3); print (array, n); 結(jié)果為: 123 (2) array = (1, 2, 3); print (arrayn); 結(jié)果為: 1 2 3 5、列表/數(shù)組的長度 當數(shù)組變量出現(xiàn)在預期簡單變量出現(xiàn)的地方,則PERL解釋器取其長度。 array = (1, 2, 3); $scalar = array; # $scalar = 3,即array的長度 ($scalar) = array; # $scalar = 1,即array第一個元素的值 注:以數(shù)組的長度為循環(huán)次數(shù)可如下編程: $count = 1; while ($count outfile)
25、;而添加模式則在原文件的末尾處繼續(xù)添加內(nèi)容,形式為:open(appendfile, appendfile)。要注意的是,不能對文件同時進行讀和寫/添加操作。 open的返回值用來確定打開文件的操作是否成功,當其成功時返回非零值,失敗時返回零,因此可以如下判斷: if (open(MYFILE, myfile) # heres what to do if the file opened successfully 當文件打開失敗時結(jié)束程序: unless (open (MYFILE, file1) die (cannot open input file file1n); 亦可用邏輯或操作符表示如
26、下: open (MYFILE, file1) | die (Could not open file); 當文件操作完畢后,用close(MYFILE); 關(guān)閉文件。 二、讀文件 語句$line = ;從文件中讀取一行數(shù)據(jù)存儲到簡單變量$line中并把文件指針向后移動一行。為標準輸入文件,通常為鍵盤輸入,不需要打開。 語句array = ;把文件的全部內(nèi)容讀入數(shù)組array,文件的每一行(含回車符)為array的一個元素。 三、寫文件 形式為: open(OUTFILE, outfile); print OUTFILE (Here is an output line.n); 注:STDOUT、
27、STDERR為標準輸出和標準錯誤文件,通常為屏幕,且不需要打開。 四、判斷文件狀態(tài) 1、文件測試操作符 語法為:-op expr,如: if (-e /path/file1) print STDERR (File file1 exists.n); 下面列出了文件測試的操作符: 操作符 描述 -b 是否為塊設(shè)備 -c 是否為字符設(shè)備 -d 是否為目錄 -e 是否存在 -f 是否為普通文件 -g 是否設(shè)置了setgid位 -k 是否設(shè)置了sticky位 -l 是否為符號鏈接 -o 是否擁有該文件 -p 是否為管道 -r 是否可讀 -s 是否非空 -t 是否表示終端 -u 是否設(shè)置了setuid位
28、-w 是否可寫 -x 是否可執(zhí)行 -z 是否為空文件 -A 距上次訪問多長時間 -B 是否為二進制文件 -C 距上次訪問文件的inode多長時間 -M 距上次修改多長時間 -O 是否只為“真正的用戶”所擁有 -R 是否只有“真正的用戶”可讀 -S 是否為socket -T 是否為文本文件 -W 是否只有真正的用戶可寫 -X 是否只有真正的用戶可執(zhí)行 注:“真正的用戶”指登錄時指定的userid,與當前進程用戶ID相對,命令suid可以改變有效用戶ID。 例: unless (open(INFILE, infile) die (Input file infile cannot be opened
29、.n); if (-e outfile) die (Output file outfile already exists.n); unless (open(OUTFILE, outfile) die (Output file outfile cannot be opened.n); 等價于 open(INFILE, infile) & !(-e outfile) & open(OUTFILE, outfile) | die(Cannot open filesn); 五、命令行參數(shù) 象C一樣,PERL也有存儲命令行參數(shù)的數(shù)組ARGV,可以用來分別處理各個命令行參數(shù);與C不同的是,$ARGV0是第
30、一個參數(shù),而不是程序名本身。 $var = $ARGV0; # 第一個參數(shù) $numargs = ARGV; # 參數(shù)的個數(shù) PERL中,操作符實際上是對數(shù)組ARGV的隱含的引用,其工作原理為: 1、當PERL解釋器第一次看到時,打開以$ARGV0為文件名的文件; 2、執(zhí)行動作shift(ARGV); 即把數(shù)組ARGV的元素向前移動一個,其元素數(shù)量即減少了一個。 3、操作符讀取在第一步打開的文件中的所有行。 4、讀完后,解釋器回到第一步重復。 例: ARGV = (myfile1, myfile2); #實際上由命令行參數(shù)賦值 while ($line = ) print ($line); 將
31、把文件myfile1和myfile2的內(nèi)容打印出來。 六、打開管道 用程序的形式也可以象命令行一樣打開和使用管道(ex:ls tempfile)。如語句open (MYPIPE, | cat hello); 打開一個管道,發(fā)送到MYPIPE的輸出成為命令cat hello的輸入。由于cat命令將顯示輸入文件的內(nèi)容,故該語句等價于open(MYPIPE, hello); 用管道發(fā)送郵件如下: open (MESSAGE, | mail dave); print MESSAGE (Hi, Dave! Your Perl program sent this!n); close (MESSAGE);
32、第六章 模式匹配 一、簡介 模式指在字符串中尋找的特定序列的字符,由反斜線包含:/def/即模式def。其用法如結(jié)合函數(shù)split將字符串用某模式分成多個單詞:array = split(/ /, $line); 二、匹配操作符 =、! =檢驗匹配是否成功:$result = $var = /abc/;若在該字符串中找到了該模式,則返回非零值,即true,不匹配則返回0,即false。!則相反。 這兩個操作符適于條件控制中,如: if ($question = /please/) print (Thank you for being polite!n); else print (That wa
33、s not very polite!n); 三、模式中的特殊字符 PERL在模式中支持一些特殊字符,可以起到一些特殊的作用。 1、字符 + +意味著一個或多個相同的字符,如:/de+f/指def、deef、deeeeef等。它盡量匹配盡可能多的相同字符,如/ab+/在字符串a(chǎn)bbc中匹配的將是abb,而不是ab。 當一行中各單詞間的空格多于一個時,可以如下分割: array = split (/ +/, $line); 注:split函數(shù)每次遇到分割模式,總是開始一個新單詞,因此若$line以空格打頭,則array的第一個元素即為空元素。但其可以區(qū)分是否真有單詞,如若$line中只有空格,則a
34、rray則為空數(shù)組。且上例中TAB字符被當作一個單詞。注意修正。 2、字符 和 意味著匹配一組字符中的一個,如/a0123456789c/將匹配a加數(shù)字加c的字符串。與+聯(lián)合使用例:/deE+f/匹配def、dEf、deef、dEdf、dEEEeeeEef等。表示除其之外的所有字符,如:/ddeEf/匹配d加非e字符加f的字符串。 3、字符 *和? 它們與+類似,區(qū)別在于*匹配0個、1個或多個相同字符,?匹配0個或1個該字符。如/de*f/匹配df、def、deeeef等;/de?f/匹配df或def。 4、轉(zhuǎn)義字符 如果你想在模式中包含通常被看作特殊意義的字符,須在其前加斜線。如:/*+/中
35、*即表示字符*,而不是上面提到的一個或多個字符的含義。斜線的表示為/。在PERL5中可用字符對Q和E來轉(zhuǎn)義。 5、匹配任意字母或數(shù)字 上面提到模式/a0123456789c/匹配字母a加任意數(shù)字加c的字符串,另一種表示方法為:/a0-9c/,類似的,a-z表示任意小寫字母,A-Z表示任意大寫字母。任意大小寫字母、數(shù)字的表示方法為:/0-9a-zA-Z/。 6、錨模式 錨 描述 或 A 僅匹配串首 $ 或 Z 僅匹配串尾 b 匹配單詞邊界 B 單詞內(nèi)部匹配 例1:/def/只匹配以def打頭的字符串,/$def/只匹配以def結(jié)尾的字符串,結(jié)合起來的/def$/只匹配字符串def(?)。A和Z在
36、多行匹配時與和$不同。 例2:檢驗變量名的類型: if ($varname = /$A-Za-z_0-9a-zA-Z*$/) print ($varname is a legal scalar variablen); elsif ($varname = /A-Za-z_0-9a-zA-Z*$/) print ($varname is a legal array variablen); elsif ($varname = /A-Za-z_0-9a-zA-Z*$/) print ($varname is a legal file variablen); else print (I dont und
37、erstand what $varname is.n); 例3:b在單詞邊界匹配:/bdef/匹配def和defghi等以def打頭的單詞,但不匹配abcdef。/defb/匹配def和abcdef等以def結(jié)尾的單詞,但不匹配defghi,/bdefb/只匹配字符串def。注意:/bdef/可匹配$defghi,因為$并不被看作是單詞的部分。 例4:B在單詞內(nèi)部匹配:/Bdef/匹配abcdef等,但不匹配def;/defB/匹配defghi等;/BdefB/匹配cdefg、abcdefghi等,但不匹配def,defghi,abcdef。 7、模式中的變量替換 將句子分成單詞: $patt
38、ern = t +; words = split(/$pattern/, $line); 8、字符范圍轉(zhuǎn)義 E 轉(zhuǎn)義字符 描述 范圍 d 任意數(shù)字 0-9 D 除數(shù)字外的任意字符 0-9 w 任意單詞字符 _0-9a-zA-Z W 任意非單詞字符 _0-9a-zA-Z s 空白 rtnf S 非空白 rtnf 例:/da-z/匹配任意數(shù)字或小寫字母。 9、匹配任意字符 字符.匹配除換行外的所有字符,通常與*合用。 10、匹配指定數(shù)目的字符 字符對指定所匹配字符的出現(xiàn)次數(shù)。如:/de1,3f/匹配def,deef和deeef;/de3f/匹配deeef;/de3,f/匹配不少于3個e在d和f之間
39、;/de0,3f/匹配不多于3個e在d和f之間。 11、指定選項 字符|指定兩個或多個選擇來匹配模式。如:/def|ghi/匹配def或ghi。 例:檢驗數(shù)字表示合法性 if ($number = /-?d+$|-?0 xXda-fa-F+$/) print ($number is a legal integer.n); else print ($number is not a legal integer.n); 其中 -?d+$ 匹配十進制數(shù)字,-?0 xXda-fa-F+$ 匹配十六進制數(shù)字。 12、模式的部分重用 當模式中匹配相同的部分出現(xiàn)多次時,可用括號括起來,用n來多次引用,以簡化表
40、達式: /d2(W)d21d2/ 匹配: 12-05-92 26.11.87 07 04 92等 注意:/d2(W)d21d2/ 不同于/(d2)(W)121/ ,后者只匹配形如17-17-17的字符串,而不匹配17-05-91等。 13、轉(zhuǎn)義和特定字符的執(zhí)行次序 象操作符一樣,轉(zhuǎn)義和特定字符也有執(zhí)行次序: 特殊字符 描述 () 模式內(nèi)存 + * ? 出現(xiàn)次數(shù) $ b B 錨 | 選項 14、指定模式定界符 缺省的,模式定界符為反斜線/,但其可用字母m自行指定,如: m!/u/jqpublic/perl/prog1! 等價于/u/jqpublic/perl/prog1/ 注:當用字母作為定界符
41、時,不做變量替換;當用特殊字符作為定界符時,其轉(zhuǎn)義功能或特殊功能即不能使用。 15、模式次序變量 在模式匹配后調(diào)用重用部分的結(jié)果可用變量$n,全部的結(jié)果用變量$&。 $string = This string contains the number 25.11.; $string = /-?(d+).?(d+)/; # 匹配結(jié)果為25.11 $integerpart = $1; # now $integerpart = 25 $decimalpart = $2; # now $decimalpart = 11 $totalpart = $&; # now totalpart = 25.11 四
42、、模式匹配選項 選項 描述 g 匹配所有可能的模式 i 忽略大小寫 m 將串視為多行 o 只賦值一次 s 將串視為單行 x 忽略模式中的空白 1、匹配所有可能的模式(g選項) matches = balata = /.a/g; # now matches = (ba, la, ta) 匹配的循環(huán): while (balata = /.a/g) $match = $&; print ($matchn); 結(jié)果為: ba la ta 當使用了選項g時,可用函數(shù)pos來控制下次匹配的偏移: $offset = pos($string); pos($string) = $newoffset; 2、忽略
43、大小寫(i選項)例 /de/i 匹配de,dE,De和DE。 3、將字符串看作多行(m選項) 在此情況下,符號匹配字符串的起始或新的一行的起始;$符號匹配任意行的末尾。 4、只執(zhí)行一次變量替換例 $var = 1; $line = ; while ($var 10) $result = $line = /$var/o; $line = ; $var+; 每次均匹配/1/。 5、將字符串看作單行例 /a.*bc/s匹配字符串a(chǎn)xxxxx nxxxxbc,但/a.*bc/則不匹配該字符串。 6、在模式中忽略空格 /d2 (W) d2 1 d2/x等價于/d2(W)d21d2/。 五、替換操作符 語
44、法為s/pattern/replacement/,其效果為將字符串中與pattern匹配的部分換成replacement。如: $string = abc123def; $string = s/123/456/; # now $string = abc456def; 在替換部分可使用模式次序變量$n,如s/(d+)/$1/,但在替換部分不支持模式的特殊字符,如,*,+等,如s/abc/def/將把abc替換為def。 替換操作符的選項如下表: 選項 描述 g 改變模式中的所有匹配 i 忽略模式中的大小寫 e 替換字符串作為表達式 m 將待匹配串視為多行 o 僅賦值一次 s 將待匹配串視為單行
45、x 忽略模式中的空白 注:e選項把替換部分的字符串看作表達式,在替換之前先計算其值,如: $string = 0abc1; $string = s/a-zA-Z+/$& x 2/e; # now $string = 0abcabc1 六、翻譯操作符 這是另一種替換方式,語法如:tr/string1/string2/。同樣,string2為替換部分,但其效果是把string1中的第一個字符替換為string2中的第一個字符,把string1中的第二個字符替換為string2中的第二個字符,依此類推。如: $string = abcdefghicba; $string = tr/abc/def/;
46、 # now string = defdefghifed 當string1比string2長時,其多余字符替換為string2的最后一個字符;當string1中同一個字符出現(xiàn)多次時,將使用第一個替換字符。 翻譯操作符的選項如下: 選項 描述 c 翻譯所有未指定字符 d 刪除所有指定字符 s 把多個相同的輸出字符縮成一個 如$string = tr/d/ /c;把所有非數(shù)字字符替換為空格。$string = tr/t /d;刪除tab和空格; $string = tr/0-9/ /cs;把數(shù)字間的其它字符替換為一個空格。 七、擴展模式匹配 PERL支持PERL4和標準UNIX模式匹配操作所沒有的
47、一些模式匹配能力。其語法為:(?pattern),其中c是一個字符,pattern是起作用的模式或子模式。 1、不存貯括號內(nèi)的匹配內(nèi)容 在PERL的模式中,括號內(nèi)的子模式將存貯在內(nèi)存中,此功能即取消存貯該括號內(nèi)的匹配內(nèi)容,如/(?:a|b|c)(d|e)f1/中的1表示已匹配的d或e,而不是a或b或c。 2、內(nèi)嵌模式選項 通常模式選項置于其后,有四個選項:i、m、s、x可以內(nèi)嵌使用,語法為:/(?option)pattern/,等價于/pattern/option。 3、肯定的和否定的預見匹配 肯定的預見匹配語法為/pattern(?=string)/,其意義為匹配后面為string的模式,相
48、反的,(?!string)意義為匹配后面非string的模式,如: $string = 25abc8; $string = /abc(?=0-9)/; $matched = $&; # $&為已匹配的模式,此處為abc,而不是abc8 4、模式注釋 PERL5中可以在模式中用?#來加注釋,如: if ($string = /(?i)a-z2,3(?# match two or three alphabetic characters)/ . 第七章 控制結(jié)構(gòu) 一、條件判斷 if ( ) elsif ( ) . else 二、循環(huán): 1、while循環(huán) while ( ) 2、until循環(huán) un
49、til ( ) 3、類C的for循環(huán) ,如 for ($count=1; $count = 5; $count+) # statements inside the loop go here 下面是在for循環(huán)中使用逗號操作符的例子: for ($line = , $count = 1; $count = 3; $line = , $count+) print ($line); 它等價于下列語句: $line = ; $count = 1; while ($count = 3) print ($line); $line = ; $count+; 4、針對列表(數(shù)組)每個元素的循環(huán):foreach
50、,語法為: foreach localvar (listexpr) statement_block; 例: foreach $word (words) if ($word eq the) print (found the word then); 注: (1)此處的循環(huán)變量localvar是個局部變量,如果在此之前它已有值,則循環(huán)后仍恢復該值。 (2)在循環(huán)中改變局部變量,相應的數(shù)組變量也會改變,如: list = (1, 2, 3, 4, 5); foreach $temp (list) if ($temp = 2) $temp = 20; 此時list已變成了(1, 20, 3, 4, 5)
51、。 5、do循環(huán) do statement_block while_or_until (condexpr); do循環(huán)至少執(zhí)行一次循環(huán)。 6、循環(huán)控制 退出循環(huán)為last,與C中的break作用相同;執(zhí)行下一個循環(huán)為next,與C中的continue作用相同;PERL特有的一個命令是redo,其含義是重復此次循環(huán),即循環(huán)變量不變,回到循環(huán)起始點,但要注意,redo命令在do循環(huán)中不起作用。 7、傳統(tǒng)的goto label;語句。 三、單行條件 語法為statement keyword condexpr。其中keyword可為if、unless、while或until,如: print (Thi
52、s is zero.n) if ($var = 0); print (This is zero.n) unless ($var != 0); print (Not zero yet.n) while ($var- 0); print (Not zero yet.n) until ($var- = 0); 雖然條件判斷寫在后面,但卻是先執(zhí)行的。 第八章 子程序 一、定義 子程序即執(zhí)行一個特殊任務的一段分離的代碼,它可以使減少重復代碼且使程序易讀。PERL中,子程序可以出現(xiàn)在程序的任何地方。定義方法為: sub subroutine statements; 二、調(diào)用 調(diào)用方法如下: 1、用&調(diào)用
53、&subname; . sub subname . 2、先定義后調(diào)用 ,可以省略&符號 sub subname . . subname; 3、前向引用 ,先定義子程序名,后面再定義子程序體 sub subname; . subname; . sub subname . 4、用do調(diào)用 do my_sub(1, 2, 3);等價于&my_sub(1, 2, 3); 三、返回值 缺省的,子程序中最后一個語句的值將用作返回值。語句return (retval);也可以推出子程序并返回值retval,retval可以為列表。 四、局部變量 子程序中局部變量的定義有兩種方法:my和local。其區(qū)別是:
54、my定義的變量只在該子程序中存在;而local定義的變量不存在于主程序中,但存在于該子程序和該子程序調(diào)用的子程序中(在PERL4中沒有my)。定義時可以給其賦值,如: my($scalar) = 43; local(array) = (1, 2, 3); 五、子程序參數(shù)傳遞 1、形式 &sub1(&number1, $number2, $nubmer3); . sub sub1 my($number1, $number2, $number3) = _; . 2、傳送數(shù)組 &addlist (mylist); &addlist (14, 6, 11); &addlist ($value1, su
55、blist, $value2); . sub addlist my (list) = _; . 參數(shù)為數(shù)組時,子程序只將它賦給一個數(shù)組變量。如 sub twolists my (list1, list2) = _; 中l(wèi)ist2必然為空。但簡單變量和數(shù)組變量可以同時傳遞: &twoargs(47, mylist); # 47賦給$scalar,mylist賦給list &twoargs(mylist); # mylist的第一個元素賦給$scalar,其余的元素賦給list . sub twoargs my ($scalar, list) = _; . 六、遞歸子程序 PERL中,子程序可以互
56、相調(diào)用,其調(diào)用方法與上述相同,當調(diào)用該子程序本身時,即成了遞歸子程序。遞歸子程序有兩個條件:1、除了不被子程序改變的變量外,所有的變量必須的局部的;2、該子程序要含有停止調(diào)用本身的代碼。 七、用別名傳遞數(shù)組參數(shù) 1、用前面講到的調(diào)用方法&my_sub(array)將把數(shù)組array的數(shù)據(jù)拷貝到子程序中的變量_中,當數(shù)組很大時,將會花費較多的資源和時間,而用別名傳遞將不做這些工作,而對該數(shù)組直接操作。形式如: myarray = (1, 2, 3, 4, 5); &my_sub(*myarray); sub my_sub my (*subarray) = _; 2、此方法類似于C語言中的傳遞數(shù)組
57、的起始地址指針,但并不一樣,在定義數(shù)組的別名之后,如果有同名的簡單變量,則對該變量也是起作用的。如: $foo = 26; foo = (heres, a, list); &testsub (*foo); . sub testsub local (*printarray) = _; . $printarray = 61; 當子程序執(zhí)行完,主程序中的$foo的值已經(jīng)成了61,而不再是26了。 3、用別名的方法可以傳遞多個數(shù)組,如: array1 = (1, 2, 3); array2 = (4, 5, 6); &two_array_sub (*array1, *array2); sub two_
58、array_sub my (*subarray1, *subarray2) = _; 在該子程序中,subarray1是array1的別名,subarray2是array2的別名。 八、預定義的子程序 PERL5預定義了三個子程序,分別在特定的時間執(zhí)行,它們是:BEGIN子程序在程序啟動時被調(diào)用;END子程序在程序結(jié)束時被調(diào)用;AUTOLOAD子程序在找不到某個子程序時被調(diào)用。你可以自己定義它們,以在特定時間執(zhí)行所需要的動作。如: BEGIN print(Hi! Welcome to Perl!n); AUTOLOAD print(subroutine $AUTOLOAD not foundn
59、); # 變量$AUTOLOAD即未找到的子程序名 print(arguments passed: _n); 若同一個預定義子程序定義了多個,則BEGIN順序執(zhí)行,END逆序執(zhí)行。 第九章 關(guān)聯(lián)數(shù)組/哈希表 一、數(shù)組變量的限制 在前面講的數(shù)組變量中,可以通過下標訪問其中的元素。例如,下列語句訪問數(shù)組array的第三個元素: $scalar = $array2; 雖然數(shù)組很有用,但它們有一個顯著缺陷,即很難記住哪個元素存貯的什么內(nèi)容。假如我們來寫一個程序計算某文件中首字母大寫的單詞出現(xiàn)的次數(shù),用數(shù)組來實現(xiàn)就比較困難,程序代碼如下: 1 : #!/usr/local/bin/perl 2 : 3
60、: while ($inputline = ) 4 : while ($inputline = /bA-ZS+/g) 5 : $word = $&; 6 : $word = s/;.,:-$/; # remove punctuation 7 : for ($count = 1; $count = wordlist; 8 : $count+) 9 : $found = 0; 10: if ($wordlist$count-1 eq $word) 11: $found = 1; 12: $wordcount$count-1 += 1; 13: last; 14: 15: 16: if ($foun
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 IEC 63584:2024 EN Open Charge Point Protocol (OCPP)
- 公司裝修合同正規(guī)
- 浴場承包合同
- 電腦維護保養(yǎng)合同
- 公立醫(yī)院職工購房借款合同
- 化糞池設(shè)備銷售合同
- 房地產(chǎn)物業(yè)售樓處服務合同
- 場地房屋租賃服務合同
- 擔保借款三方合同
- 擋土墻施工承包合同
- 數(shù)據(jù)中心供配電系統(tǒng)概述演示
- TSG11-2020鍋爐安全技術(shù)規(guī)程(現(xiàn)行)
- 義務教育(音樂)課程標準(2022年版)解讀
- 第三章企業(yè)的生產(chǎn)和成本
- 統(tǒng)編版 高中語文 必修下冊 《祝?!贰读纸填^風雪山神廟》
- 2024年職教高考《機械制圖》考試題庫
- 九型人格與親子教育課件
- 2025屆高校畢業(yè)生公開招聘工作人員報名登記表
- DB34∕T 2290-2022 水利工程質(zhì)量檢測規(guī)程
- GB/T 44399-2024移動式金屬氫化物可逆儲放氫系統(tǒng)
- 薛崗小學反邪教工作計劃
評論
0/150
提交評論