Perl 基本語法_第1頁
Perl 基本語法_第2頁
Perl 基本語法_第3頁
Perl 基本語法_第4頁
Perl 基本語法_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Perl 基本語法標量數(shù)字字符串數(shù)字和字符串之間的自動轉換Perl 內嵌的警告標量變量print 輸出if 控制結構Boolean 值用戶的輸入 <STDIN>chomp 操作while 控制結構undef 值defined 函數(shù)列表和數(shù)組qw 簡寫列表賦值pop 和 push 操作shift 和 unshift 操作字符串中引用數(shù)組foreach 控制結構最常用的默認變量 : $_reverse 操作sort 操作標量和列表上下文子程序使用 sub 定義子程序調用子程序參數(shù)my 變量使用 strict Pragma省略 &輸入和輸出從標準輸入設備輸入從 <>

2、輸入調用參數(shù)輸出到標準輸出設備使用 printf 格式化輸出數(shù)組和 printf句柄 (即文件描述符)文件句柄的打開Bad 文件句柄關閉文件句柄嚴重錯誤和 die使用文件句柄哈希什么是哈希哈希元素的存取哈希函數(shù)正則表達式簡單的模式正則表達式的應用使用 m/ 匹配可選的修飾符錨定匹配變量使用正則表達式處理文件使用 s/ 進行替換split 操作join 函數(shù)列表上下文中的 m/更強大的正則表達式更多控制結構unless 控制結構until 控制結構表達式修飾符The Naked Block 控制結構elsif 語句自增和自減 (同C)for 控制結構 (同C)循環(huán)控制邏輯操作符 &&am

3、p; 和 |文件校驗文件檢測操作stat 和 lstat 函數(shù)localtime 函數(shù)位操作目錄操作在目錄樹上移動GlobbingGlobbing 的替換語法目錄句柄刪除文件 unlink重命名文件鏈接文件創(chuàng)建和刪除目錄修改權限改變所有者改變時間戳字符串和排序使用索引尋找子串使用 substr 操作子串使用 sprintf 格式化數(shù)據(jù)進程管理system 函數(shù)exec 函數(shù)環(huán)境變量使用反引號得到輸出像文件句柄一樣處理進程fork 函數(shù)發(fā)送和接受信號Perl 模塊查找安裝模塊使用簡單的模塊一些高級的 Perl 技術利用 eval 捕捉錯誤標量標量是 Perl 中最簡單的數(shù)據(jù)類型。大多數(shù)的標量是數(shù)

4、字(如 255 或 3.25e20)或 者字符串(如 hello或者蓋茨堡地址)。數(shù)字perl中所有數(shù)字內部的格式都是雙精度浮點數(shù)。浮點數(shù)1.25255.000255.07.25e45 #7.25x10 的 45 次方(一個大整數(shù))-6.5e24 # -6.5x10 的 24 次方(一個大的負數(shù))-12e-24 #- -12x10 的-24 次方(很小的負數(shù))-1.2E-23 #指數(shù)符號可以大寫(E)整數(shù)02001-40255其中也可以寫作:61_298_040_283_768非十進制整數(shù)0377 #八進制數(shù)字 377,等同于十進制數(shù)字 2550xff #十六進制數(shù)字 FF,等同于十進制數(shù)字

5、2550b11111111 #等同于十進制數(shù)字 255可以用下劃線表示:0x1377_0B770x50_65_72_7C數(shù)字操作符2+3 #2+3,55.1-2.4 #5.1-2.4,2.73*12 #3*12,3614/2 #14/2,710.2/0.3 #10.2/0.3,3410/3 #通常是浮點除,3.33333. .字符串單引號字符串'fred' #四個字符:f,r,e,d'' #空字符(沒有字符)'hellon'''' #單引號(')跟著反斜線()字符串單引號中的 "n"&

6、#160;不會被當作換行符來處理。雙引號字符串"barney" #等同于 'barney'"hello worldn" #hello world,換行字符串操作符鏈接操作符 ".""hello"."world" # 同于 "helloworld""hello".''."world" # 同于 "hello world"'hello world'."n"

7、; # 同于 "hello worldn"重復操作符 "x""fred" x 3 # "fredfredfred"5 x 4 # 等于 "5" x 4, "5555"數(shù)字和字符串之間的自動轉換大多數(shù)情況下,Perl 將在需要的時候自動在數(shù)字和字符串之間轉換。它怎樣知道 什么時候需要字符串,什么時候需要數(shù)字呢?這完全依賴于標量值之間的的操作符。 如果操作符(如+)需要數(shù)字,Perl 將把操作數(shù)當作數(shù)字看待。如果操作符需要字符 串(如 . ), Perl 將把操作數(shù)當作字符串看待

8、。不必擔心數(shù)字和字符串的區(qū)別;使 用恰當?shù)牟僮鞣?Perl 將為你做剩下的事。"12" * "3" # * 操作符需要數(shù)字,所以結果為 36"12fred34" * " 3" # 結果仍然是 36 , 后面的非數(shù)字部分和前面的空格都過濾掉。"Z" . 5 * 7 # 等于 "Z".35, 或 "Z35"Perl 內嵌的警告使用 -w 參數(shù)可以打開警告:$ perl -w perl程序 # 命令行執(zhí)行警告#!/usr/bin/perl -w # 源代碼中使用

9、警告標量變量標量變量可以存放一個標量值。標量變量的名字由一個美圓符號($)后接 Perl 標 識符:由字母或下劃線開頭,后接字母,數(shù)字,或者下劃線。或者說由字母,數(shù)字和下 劃線組成,但不能由數(shù)字開頭。大小寫是嚴格區(qū)分的:變量$Fred 和變量$fred是不 同的。任意字母,數(shù)字,下劃線都有意義,如:$a_very_long_variable_that_ends_in_1$a_very_long_variable_that_ends_in_2標量賦值$fred = 17;$barney = "hello"$barney = $fred + 3;# 將$fred 的值加上三賦給

10、$barney (20)$barney= $barney*2;#將變量$barney 乘 2 再賦給$barney (40)二元賦值操作符$fred = $fred + 5; #沒有用二元賦值操作符$fred+=5; #利用二元賦值操作符$barney = $barney*3;$barney*=3;$str = str . "" #$str 后接空格;$str .= "" #同上print 輸出print "hello worldn" #輸出 hello world,后接換行符print "The answer is&quo

11、t;, 6*7, ".n"字符串中引用標量變量$meal = "brontosaurus steak" ;$barney = "fred ate a $meal"$barney = 'fred ate a'.$meal; # 同上if 控制結構if ($name gt 'fred') print "$namecomes after 'fred' in sorted order.n"Boolean 值perl 沒有專門的 Boolean 值, 真假值這樣判斷:·

12、; 如果值為數(shù)字,0 是 false;其余為真· 如果值為字符串,則空串()為 false;其余為真· 如果值的類型既不是數(shù)字又不是字符串,則將其轉換為數(shù)字或字符串后再利用上述規(guī)則這些規(guī)則中有一個特殊的地方。由于字符串'0' 和數(shù)字 0 有相同的標量值,Perl 將它們相同看待。也就是說字符串 '0' 是唯一一個非空但值為 0 的串。用戶的輸入 <STDIN>chomp 操作$text = "a line of textn" # 也可以由<STDIN>輸入chomp($text); #去掉換行符(n

13、)。一步執(zhí)行:chomp ($text = <STDIN>); #讀入,但不含換行符chomp 是一個函數(shù)。作為一個函數(shù),它有一個返回值,為移除的字符的個數(shù)。這個 數(shù)字基本上沒什么用:$food = <STDIN>$betty = chomp $food; #得到值 1如上,在使用 chomp 時,可以使用或不使用括號()。這又是 Perl 中的一條通用規(guī) 則:除非移除它們時含義會變,否則括號是可以省略的。while 控制結構$count = 0;while ($count < 10) $count + = 2; print "count is now

14、$countn"undef 值變量被賦值之前使用它會有什么情況發(fā)生呢?通常不會有什么嚴重的后果。變量在 第一次賦值前有一個特殊值 undef, 按照 Perl 來說就是:"這里什么也沒有,請繼 續(xù)"。如果這里的“什么也沒有”是一些“數(shù)字”,則表現(xiàn)為 0。如果是“字符串”,則表 現(xiàn)為空串。但 undef 既非數(shù)字也非字符串,它是另一種標量類型。defined 函數(shù)能返回 undef 的操作之一是行輸入操作,<STDIN>。通常,它會返回文本中的一行。 但如果沒有更多的輸入,如到了文件的結尾,則返回 undef。要分辨其是 undef 還 是空串,可以使用

15、 defined 函數(shù), ,如果其參數(shù)是 undef 值就返回 false,其他 值返回 true。$madonna = <STDIN>If ($defined ($madonna) print "The input was $madonna" else print "No input available!n;如果想聲明自己的 undef 值,可以使用 undef:$madonna = undef ; #同$madonna 從未被初始化一樣。列表和數(shù)組#!/usr/bin/env perl -w$fred0 = "yabba"$fr

16、ed1 = "dabba"$fred2 = "doo"print fred;#print fred."n"qw 簡寫qw ! fred barney betty wilma dino !qw# fred barney betty wilma dino # #有些像注釋qw( fred barney betty wilma dino ).列表賦值($fred, $barney, $dino) = ("flintstone", "rubble", undef);($fred, $barney) =

17、qw <flintstone rubble slate granite> #兩個值被忽略了($rocks0,$rocks1,$rocks2,$rocks3) = qw/talc mica feldspar quartz/;當想引用這個數(shù)組時, Perl 有一種簡單的寫法。在數(shù)組名前加(后沒有中括號) 來引用整個數(shù)組。 你可以把他讀作 "all of the "(所有的)”,所以rocks 可以 讀作 "all of the rocks(所有的石頭)"。其在賦值運算符左右均有效:rocks = qw / bedrock slate lava /

18、;tiny = (); #空表giant = 1.1e5; #包含 100,000 個元素的表stuff = (giant, undef, giant); #包含 200,001 個元素的表dino = "granite"quarry = (rocks, "crushed rock", tiny, $dino);pop 和 push 操作array = 5.9;$fred = pop(array); #$fred 得到 9,array 現(xiàn)在為(5,6,7,8)$barney = pop array; #$barney gets 8, array 現(xiàn)在為(

19、5,6,7)pop array; #array 現(xiàn)在為(5,6)(7 被丟棄了)push(array,0); #array 現(xiàn)在為(5,6,0)push array,8; #array 現(xiàn)在為(5,6,0,8)push array,1.10; #array 現(xiàn)在多了 10 個元素others =qw/9 0 2 1 0 /;push array,others; #array 現(xiàn)在又多了 5 個元素(共有 19 個)shift 和 unshift 操作push 和 pop 對數(shù)組的末尾進行操作(或者說數(shù)組右邊有最大下標的元素,這依賴 于你是怎樣思考的)。相應的, unshift 和 shift

20、對一個數(shù)組的開頭進行操作(數(shù) 組的左端有最小下標的元素) 。下面是一些例子:array = qw# dino fred barney #;$m = shift (array); #$m 得到 "dino", array 現(xiàn)在為 ("fred", "barney")$n = shift array; #$n 得到 "fred", array 現(xiàn)在為 ("barney")shift array; #array 現(xiàn)在為空$o = shift array; #$o 得到 undef, arry 仍為空u

21、nshift(array,5); #array 現(xiàn)在為(5)unshift array,4; #array 現(xiàn)在為(4,5)others = 1.3;unshift array, others; #array 現(xiàn)在為(1,2,3,4,5)和 pop 類似,如果其數(shù)組變量為空,則返回 undef。字符串中引用數(shù)組和標量類似,數(shù)組也可以插入雙引號的字符串中。插入的數(shù)組元素會自動由空格分 開:rocks = qw flintstone slate rubble ;print "quartz rocks limestonen" #輸出為 5 種 rocks 由空格分開foreach

22、 控制結構foreach $rock (qw/ bedrock slate lava /) print "One rock is $rock.n" ; #打印出 3 種 rocks這里的$rock不是這些列表元素中的一個拷貝而是這些元素本身最常用的默認變量 : $_如果在 foreach 循環(huán)中省略了控制變量,那 Perl 會使用其默認的變量:$_。除了 其不尋常的名字外,這和普通變量類似,如下面代碼所示:foreach(1.10) #使用默認的變量$_ print "I can count to $_!n"$_ = "Yabba dabba

23、doon"print; # 打印出默認變量 $_reverse 操作reverse(逆轉)操作將輸入的一串列表(可能是數(shù)組)按相反的順序返回。fred = 6 . 10;barney = reverse (fred); #得到 10,9,8,7,6wilma = reverse 6 . .10; #同上,沒有使用額外的數(shù)組fred = reverse fred; #將逆轉過的字符串存回去sort 操作rocks = qw/ bedrock slate rubble granite /;sorted = sort(rocks); #得到 bedrock, granite, rubble

24、, slate標量和列表上下文42 + something #something 必須是標量sort something #something 必須是列表people = qw( fred barney betty );sorted = sort people; #列表內容: barney , betty, fred$number = 42 + people; #標量內容:42+3,得到 45另一個例子是 reverse。在列表 context 中,它返回反轉的列表。在標量 context 中,返回反轉的字符串(或者將反轉的結果串成一個字符串):backwards = reverse qw /

25、 yabba dabba doo /;#返回 doo, dabba, yabba$backwards = reverse qw/ yabba dabba doo /;#返回 oodabbadabbay在列表 Context 中使用 Scalar-Producing 表達式如果一個表達式不是列表值,則標量值自動轉換為一個元素的列表:fred = 6*7;barney = "hello" . '' . "world"強制轉換為標量 Context偶爾,你可能需要標量 context 而 Perl 期望的是列表。這種情況下,可以使用函數(shù) sca

26、lar。它不是一個真實的函數(shù)因為其僅是告訴 Perl 提供一個標量 context:rocks = qw(talc quartz jade obsidian);print "How many rocks do you have?n;print "I have " rocks, "rocks!n" # 錯誤,輸出 rocks 的名字print "I have " scalar rocks, "rocks!n; # 正確,輸出其數(shù)字<STDIN> 在列表 Context 中l(wèi)ines = <STDIN

27、> #將輸入讀入列表 context 中chomp (lines = <STDIN>); #讀入所有的行,不包括換行符子程序使用 sub 定義子程序sub marine $n + = 1; #全局變量$n print "Hello, sailor number $n!n"調用子程序&marine; #輸出 Hello, sailor number 1!&marine; #輸出 Hello, sailor number 2!&marine; #輸出 Hello, sailor number 3!&marine; #輸出 Hel

28、lo, sailor number 4!通常有括號,即便參數(shù)為空。子程序將繼承調用者的 _ 的值。參數(shù)$n = &max(10,15); # 此子程序有 2 個參數(shù)此參數(shù)列表被傳到子程序中;這些參數(shù)可以被子程序使用。當然,這些參存放在某 個地方,在 Perl 中,會自動將此參數(shù)列表(此參數(shù)列表的另一個名字)自動存放在 一個叫做_的數(shù)組中。子程序可以訪問次數(shù)組變量來確定此參數(shù)的個數(shù)以及其值。 這也就是說此子程序參數(shù)的第一個值存放在$_0中,第二個存放在$_1,依次類 推。但必須強調的是這些變量和 $_ 這個變量沒有任何關系,如$dino3(數(shù)組 dino 的一個元素)和$dino 的關系

29、一樣。這些參數(shù)必須存放在某個數(shù)組變量中, Perl 存放在_這個變量中。 sub max if($_0 > $_1) $_0; else $_1; my 變量foreach (1.10) my($square) = $_*$_; #本循環(huán)中的私有變量 print "$_ squared is $squrare.n"變量$square 是私有的,僅在此塊中可見;在本例中,此塊為 foreach 循環(huán)塊。當然,my 操作不會改變賦值參數(shù)的 context:my ($num) = _; # 列表 context, 同($sum) = _;my $num = _; # 標量

30、context,同$num = _;使用 strict Pragmause strict; #迫使采用更嚴格的檢測省略 &有些地方調用子程序可以不要 my cards = shuffle(deck_of_cards); # &是不必要的輸入和輸出從標準輸入設備輸入從標準輸入設備輸入是容易的。使用<STDIN>。在標量 context 中它將返回輸入的下一行:$line = <STDIN> #讀入下一行;chomp($line); #去掉結尾的換行符chomp($line=<STDIN>) #同上,更常用的方法于,行輸入操作在到達文件的結尾時將

31、返回 undef,這對于從循環(huán)退出時非常方便的:while (defined($line = <STDIN>) print "I saw $line"從 <> 輸入尖括號操作(<>)是一種特殊的行輸入操作。其輸入可由用戶選擇$n = 0;while (defined($line = <>) $n += 1; chomp($line); print "$n $linen"while (<>) chomp; print "It was $_ that I saw!n"調用參數(shù)技術

32、上講,<>從數(shù)組ARGV 中得到調用參數(shù)。這個數(shù)組是 Perl 中的一個特殊數(shù) 組,其包含調用參數(shù)的列表。 換句話說,這和一般數(shù)組沒什么兩樣 (除了其名字 有些特別: 全為大寫字母) ,程序開始運行時,調用參數(shù)已被存在ARGV 之中了。輸出到標準輸出設備print array; #打印出元素的列表print "array" #打印一個字符串(包含一個內插的數(shù)組)第一個語句打印出所有的元素,一個接著一個,其中沒有空格。第二個打印出一個 元素,它為array 的所有元素,其被存在一個字符串中。也就是說,打印出array 的所有元素,并由空格分開。如果array 包含

33、 qw /fred barney betty /,則第一 個例子輸出為:fredbarneybetty,而第二個例子輸出為 fred barney betty(由空 格分開)。使用 printf 格式化輸出printf "Hello, %s : your password expires in %d days!n", $user, $days_to_die;printf "%6fn" 42; # 輸出為 42 (此處指代空格)printf "%23n",2e3+1.95; # 2001數(shù)組和 printfmy items = qw(

34、wilma dino pebbles );my $format = "The items are:n". ("%10sn" x items);printf $format, items;等同:printf "The items are:n". ("%10sn"x items), items;本處 items 有兩個不同的 context (上下文),第一次表示元素個數(shù),第二次 表示列表中的所有元素。句柄 (即文件描述符)Perl 自身有六個文件句柄 : STDIN,STDOUT,STDERR,DATA,ARGV,A

35、RGVOUT文件句柄的打開open CONFIG, "dino" ;open CONFIG, "<dino" ;open BEDROCK, ">fred" ;open LOG, ">>logfile" ;Perl 的新版本中(從 Perl5.6 開始),open 支持“3 參數(shù)”類型:open CONFIG, "<", "dino"open BEDROCK, ">", $file_name;open LOG, "

36、;>>", &logfile_name();Bad 文件句柄關閉文件句柄close BEDROCK;嚴重錯誤和 die可以和 C 中使用 perror 類似,用 die 函數(shù):if (!open LOG, ">>logfile") die "Cannot create logfile:$!"使用文件句柄if (!open PASSWD, "/etc/passwd") die "How did you get logged in?($!)"while (<PASSWD&

37、gt;) chomp; .哈希什么是哈希和 Python 的字典一樣哈希元素的存取$hash $some_key作為整體的 hash要引用整個 hash,使用百分號(“%” )作為前綴。%some_hash = ("foo",35, "bar", 12.4, 2.5, "hello", "wilma", 1.72e30, "betty", "byen");hash 的值(在列表 context 中)是一個 key/value 對的列表 :array_array = %some

38、_hash;哈希賦值%new_hash = %old_hash;%inverse_hash = reverse %any_hash;大箭頭符號 (=>)my %last_name = ( "fred” => "flintstone", "dino" => undef, "barney" => "rubble", "betty" => "rubble",);哈希函數(shù)keys 和 valuesmy %hash = ("a"

39、; => 1, "b" => 2, "c" => 3);my k = keys %hash;my v = values %hash;each 函數(shù)while ($key, $value) = each %hash) print "$key => $valuen"exists 函數(shù)if (exists $books$dino) print "Hey, there's a libaray card for dino!n"delete 函數(shù)my $person = "betty&

40、quot;delete $books$person; # 將$person 的借書卡刪除掉正則表達式簡單的模式$_ = "yabba dabba doo"if (/abba/) print "It matched!n"所有在雙引號中的轉義字符在模式中均有效,因此你可以使用 /coketsprite/ 來 匹配 11 個字符的字符串 coke, tab(制表符),sprite。元字符.?+*模式中的分組/fred+/ # 只能匹配 fredddddd 等/(fred)+/ # 能匹配 fredfredfred 等/(fred)*/ #

41、可以匹配 "hello,world", 因為 * 是匹配前面的 0或多次選擇符 (|)/fred|barney|betty/fred( |t)+barney/字符類指 中的一列字符。字符類的簡寫d = 0-9w = A-Za-z0-9_s = ftnr # 格式符(form-feed)、制表符(tab)、換行符、回車簡寫形式的補集D = dW = wS = s可以組合:dD # 任何數(shù)字和任何非數(shù)字,可以匹配所有字符!比如 . 是不能匹配所有字符的dD # 無用正則表達式的應用使用 m/ 匹配同 qw / 一樣,可以使用任何成對字符,比如可以使用 m(fred), m<

42、;fred>, mfred, mfred,或者 m,fred, m!fred!, mfred。如果使用 / 作為分隔符,可以省略前面的 m如果使用配對的分隔符, 那不用當心模式內部會出現(xiàn)這些分隔符, 因為通常模式 內部的分隔符也是配對的。 因此, m(fred(.*)barney), mw2, mwilman t+betty是正確的。對于尖括號(<和>),它們通常不是配對的。如 模式 m(d+)s*>=?s*(d+),如果使用尖括號,模式中的尖括號前因當使用反斜 線(), 以免模式被過早的結束掉??蛇x的修飾符不區(qū)分大小寫: /iif (/yes/i) #大小寫無關 pr

43、int "In that case, I recommend that you go bowling.n"匹配任何字符: /s使用/s 這個修飾符,它將模式中點 (.) 的行為變成同字符類 dD 的行為類 似:可以匹配任何字符,包括換行符。從下例中可見其區(qū)別:$_ = "I saw Barneyndown at the bowing alleynwith Frednlast night.n;if (/Barney.*Fred/s) print "That string mentions Fred after Barney!n"添加空格: /x/

44、x 修飾符,允許你在模式中加入任何數(shù)量的空白,以方便閱讀:/-?d+.?d*/ # 這是什么含義?/ -? d+ .? d* /x # 要好些Perl 中,注釋可以被作為空白,因此使用/x,可以在模式中加上注釋:/-? #可選的負號d+ #小數(shù)點前一個或多個十進制數(shù)字.? #可選的小數(shù)點d* #小數(shù)點后一些可選的十進制數(shù)字/x #模式結束使用多個修飾符if (/barney.*fred/is/) # /i 和/s print "That string mentions Fred after Barney!n"錨定 開頭$ 結尾注意:/fred$/能同時匹配上 "f

45、red" 和 "fredn"。/s*$/ # 匹配空行詞錨定: b/bfredb/ 可以匹配單詞 "fred", 但不能匹配 "frederick"綁定操作符: =對 $_ 進行匹配只是默認的行為, 使用綁定操作符 ( = ) 將告訴 Perl 將右邊的模式在左邊的字符串上進行匹配,而非對 $_ 匹配。my $some_other = "I dream of betty rubble."if ($some_other = /brub/) print "Aye, there's the r

46、ub.n"綁定操作符優(yōu)先級較高:my $likes_perl = <STDIN> = /byesb/i;匹配變量$_ = "Hello there, neighbor"if (/s(w+),/) #空格和逗號之間的詞 print "The word was $1n"自動匹配變量$& # 整個被匹配的部分$ # 匹配部分的前一部分存放在$之中$' # 后一部分被存到$'使用正則表達式處理文件使用 s/ 進行替換$_ = "He's out bowling with Barney tonight

47、."s/Barney/Fred/; # Barney 被 Fred 替換掉print "$_n"#接上例:現(xiàn)在 $_ 為 "He's out bowling with Fred tonight."s/Wilma/Betty/; # 用 Wilma 替換 Betty(失敗)s/with (w+)/agaist $1's team/;print "$_n" # 為 "He's out bowling against Fred's team tonight."使用 /g 進行全局

48、替換$_ = "home, sweet home!"s/home/cave/g;print "$_n" # "cave, sweet cave!"全局替換的一個常用地方是將多個空格用單個空格替換掉:$_ = "Input datat may have extra whitespace."s/s+/ /g; # 現(xiàn)在是 "Input data may have extra whitespace."現(xiàn)在已經知道怎樣去掉多余的空格,那怎樣去掉開頭和結尾的空白呢?這是非常容易的:s/s+/; #將開頭的

49、空白去掉s/s+$/; #將結尾的空白去掉s/s+|s+$/g; #將開頭,結尾的空白去掉不同的分隔符如同 m/和 qw/一樣,我們也可以改變 s/的分隔符。但這里使用了3個分隔符,因 此有些不同。s#https:/#http:/#;如果使用的是配對的字符,也就是說其左字符和右字符不的,則必需使用兩對:一對 存放模式,一對存放替換的字符串。此時,分隔符甚至可以是不同的。事實上,分隔 符還可以使用普通的符號(非配對的)。下面三例是等價的:sfredbarney;sfred(barney);s<fred>#barney#;可選的修飾符除了/g 修飾符外,替換操作中還可以使用 /i ,

50、/x , 和 /s, 這些在普通的 模式匹配中已經出現(xiàn)過的修飾符。其順序是無關緊要的。s#wilma#Wilma#gi; # 將所有的 WilmA,或者 WILMA 等等,由 Wilma 替換掉s_ _END_ _.* s; # 將 END 標記及其后面的行去掉綁定操作同 m/ 一樣,我們也可以通過使用綁定操作符改變 s/ 的替換目標:$file_name = s#.*#s; # 將$file_name 中所有的 Unix 類型的路徑去掉大小寫替換有時,希望確保被替換的字符串均是大寫的(或者不是,視情況而定) 。這在 Perl 中只需使用某些修飾符就能辦到。 U 要求緊接著的均是大寫:$_ =

51、 "I saw Barney with Fred."s/(fred|barney)/U$1/gi; # $_ 現(xiàn)在是 "I saw BARNEY with FRED."同樣,也可以要求后面的均為小寫 L :s/(fred)|barney/L$1/gi; #$_現(xiàn)在是 "I saw barney with fred."默認時,會影響到剩余的(替換的)字符串??梢允褂?E 來改變這種影響:s/(w+) with (w+)/U$2E with $1/I; # $1 現(xiàn)在是 "I saw FRED with barney."

52、;使用小寫形式時( l 和 u ),只作用于下一個字符:s/ (fred|barney)/u$1/ig; #$_現(xiàn)在是 "I saw FRED with Barney."也可以同時使用它們。如使用u 和L 表示 "第一個字母大寫,其它字母均小寫"。 L 和u 可以按任意順序出現(xiàn)。Larry 意識到人們有時可能按相反順序使用它們,因 此他將 Perl 設計成,在這兩種情況下都是將第一個字母大寫,其余的小寫。 Larry 是個非常好的人。s/(fred|barney)/uL$1/ig; #$_現(xiàn)在為 "I saw Fred with Barney.

53、"這些在替換中出現(xiàn)的大小寫轉換的修飾符,也可在雙引號中使用:print "Hello, Lu$nameE, would you like to play a game?n"split 操作另一個使用正則表達式的操作是 split , 它根據(jù)某個模式將字符串分割開。這對 于由制表符分割開,冒號分割開,空白分割開,或者任意字符分割開的數(shù)據(jù)是非常有 用的。任何可在正則表達式之中 (通常,是一個簡單的正則表達式) 指定分離符 (separator) 的地方,均可用 split。其形式如下:fields = split /separtor/, $string;fields

54、= split /:/, "abc:def:g:h" # 返回 ("abc", "def", "g", "h")/s+/ 這個模式分隔符非常常見:my $some_input = "This is a t test.n"my args = split /s+/, $some_input; # ("This", "is", "a", "test." )默認時,split 對$_操作,模式為空白:my

55、 fields = split; # 同 split /s+/, $_;join 函數(shù)join 函數(shù)不使用模式,但它完成同 split 相反的操作:split 將一個字符串分割 開,而 join 函數(shù)將這些分割的部分組合成一個整體。join 函數(shù)類似于 :my $result = join $glue, pieces;join 函數(shù)的第一個參數(shù)是粘合元素(glue),它可以是任意字符串。剩下的參數(shù)是要被粘合的部分。join 將粘合元素添加在這些部分之間,并返回其結果:my $x = join ":", 4, 6, 8, 10, 12; #$x 為 "4:6:8:1

56、0:12"列表上下文中的 m/在列表 context 中使用模式匹配(m/)時,如果匹配成功返回值為內存變量值的列 表;如果匹配失敗則為空列表:$_ = "Hello there, neighbor!"my($first, $second, $third) =/(S+) (S+), (S+)/;print “$second is my $thirdn” ;在 s/ 中介紹的 /g 修飾符也可在 m/ 中使用,它允許你在字符串中的多處進 行匹配。在這里,由括號括起來的模式將在每一次匹配成功時返回其內存中所存放 的值:my $text = "Fred dro

57、pped a 5 ton granite block on Mr. Slate"my words = ($text = /(a-z+)/ig);print "Result: wordsn"#Result: Fred dropped a ton granite block on Mr slate如果有不止一對括號,每一次返回不止一個字符串。例如將字符串放入 hash 中,如下:my $data = "Barney Rubble Fred Flintstone Wilma Flintstone"my %last_name = ($data = / (w+)S+(w+)/g);每當模式匹配成功時,將返回一對值。這些一對一對的值就成了 hash 中的 key/value 對。更強大的正則表達式非貪婪的數(shù)量詞各符號對應的非貪婪匹配:+ -> /fred.+?barney/* -

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論