




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Perl基本語法
標量
數字
字符串
數字和字符串之間的自動轉換
Perl內嵌的警告
標量變量
print輸出
if控制結構
Boolean值
用戶的輸入<STD1N>
chomp操作
while控制結構
undef值
defined函數
列表和數組
qw簡寫
列表賦值
pop和push操作
shift和unshift操作
字符串中引用數組
foreach控制結構
最常用的默認變量:$
reverse操作
sort操作
標量和列表上下文
子程序
使用sub定義子程序
調用子程序
參數
my變量
使用strictPragma
省略&
輸入和輸出
從標準輸入設備輸入
從<>輸入
調用參數
輸出到標準輸出設備
使用printf格式化輸出
數組和printf
句柄(即文件描述符)
文件句柄的打開
Bad文件句柄
關閉文件句柄
嚴重錯誤和die
使用文件句柄
哈希
什么是哈希
哈希元素的存取
哈希函數
正則表達式
簡單的模式
正則表達式的應用
使用m//匹配
可選的修飾符
錨定
匹配變量
使用正則表達式處理文件
使用S///進行替換
split操作
join函數
列表上下文中的m//
更強大的正則表達式
更多控制結構
unless控制結構
until控制結構
表達式修飾符
TheNakedBlock控制結構
elsif語句
自增和自減(同C)
for控制結構(同C)
循環控制
邏輯操作符&&和II
文件校驗
文件檢測操作
stat和Istat函數
localtime函數
位操作
目錄操作
在目錄樹上移動
Globbing
Globbing的替換語法
目錄句柄
刪除文件unlink
重命名文件
鏈接文件
創建和刪除目錄
修改權限
改變所有者
改變時間戳
字符串和排序
使用索引尋找子串
使用substr操作子串
使用sprintf格式化數據
進程管理
system函數
exec函數
環境變量
使用反引號得到輸出
像文件句柄一樣處理進程
fork函數
發送和接受信號
Perl模塊
查找
安裝模塊
使用簡單的模塊
一些高級的Perl技術
利用eval捕捉錯誤
標量
標量是Perl中最簡單的數據類型。大多數的標量是數字(如255或3.25e20)或者字符串
(如hello或者蓋茨堡地址)。
數字
perl中所有數字內部的格式都是雙精度浮點數。
浮點數
1.25
255.000
255.0
7.25e45#7.25x10的45次方(一個大整數)
-6.5e24#-6.5x10的24次方(一個大的負數)
-12e-24#--12x10的-24次方(很小的負數)
-1.2E-23#指數符號可以大寫(E)
整數
0
2001
-40
255
61298040283768
其中61298040283768也可以寫作:
61_298_040_283_768
非十進制整數
0377#八進制數字377,等同于十進制數字255
Oxff#十六進制數字FF,等同于十進制數字255
Obllllllll#等同于十進制數字255
可以用下劃線表示:
0xl377_0B77
0x50_65_72_7C
數字操作符
2+3#2+3,5
5.1-2.4#5.1-2.4,2.7
3*12#3*12,36
14/2#14/2,7
10.2/0.3#10.2/0.3,34
10/3#通常是浮點除,3.33333......
字符串
單引號字符串
'fred'#四個字符:f,r,e,d
''#空字符(沒有字符)
,hello\n'
'\'W#單引號(,)跟著反斜線(\)字符串
單引號中的"\n〃不會被當作換行符來處理。
雙引號字符串
"barney"#等同于'barney,
"helloworld\n"#helloworld,換行
字符串操作符
鏈接操作符…
"hello"."world"#同于"helloworld"
"hello".''."world"#同于"helloworld"
,helloworld'."\n"#同于"helloworld\n"
重復操作符"x"
"fred"x3#"fredfredfred"
5x4#等于"5"x4,"5555"
數字和字符串之間的自動轉換
大多數情況下,Perl將在需要的時候自動在數字和字符串之間轉換。它怎樣知道什么時候
需要字符串,什么時候需要數字呢?這完全依賴于標量值之間的的操作符。如果操作符(如+)
需要數字,Perl將把操作數當作數字看待。如果操作符需要字符串(如.),Perl將把操
作數當作字符串看待.不必擔心數字和字符串的區別;使用恰當的操作符,Perl將為你做剩
下的事。
"12"*"3"#*操作符需要數字,所以結果為36
"12fred34"*"3"#結果仍然是36,后面的非數字部分和前面的空格都過
濾掉。
"Z".5*7#等于"Z".35,或"Z35"
Perl內嵌的警告
使用-w參數可以打開警告:
$perl-wperl程序#命令行執行警告
#!/usr/bin/perl-w#源代碼中使用警告
標量變量
標量變量可以存放一個標量值。標量變量的名字由一個美圓符號($)后接Perl標識符:由
字母或下劃線開頭,后接字母,數字,或者下劃線。或者說由字母,數字和下劃線組成,但不能
由數字開頭。大小寫是嚴格區分的:變量$Fred和變量$fred是不同的。任意字母,數字,下
劃線都有意義,如:
$a_very_long_variable_that_ends_in_l
$a_very_long_variable_that_ends_in_2
標量賦值
$fred=17;
$barney="hello11;
$barney=$fred+3;#^$fred的值力口上三賦給$barney(20)
$barney=$barney*2;#將變量$barney乘2再賦給$barney(40)
二元賦值操作符
$fred=$fred+5;#沒有用二元賦值操作符
$fred+=5;#利用二元賦值操作符
$barney=$barney*3;
$barney*=3;
$str=str?"n;#$str后接空格;
$str.=#同上
print輸出
print"helloworld\nH;#輸出helloworld,后接換行符
print"Theansweris",6*7,n.\nn
字符串中引用標量變量
$meal="brontosaurussteak”;
$barney=Hfredatea$meal";
$barney=1fredatea1.$meal;#同上
if控制結構
if($namegtffred1){
printn$name,comesafter'fred'insortedorder.\nH;
)
Boolean值
perl沒有專門的Boolean值,真假值這樣判斷:
?如果值為數字,0是false;其余為真
?如果值為字符串,則空串(')為false;其余為真
?如果值的類型既不是數字又不是字符串,則將其轉換為數字或字符串后再利用上述
規則
這些規則中有一個特殊的地方。由于字符串‘0'和數字0有相同的標量值,Perl將它們相
同看待。也就是說字符串’0'是唯一一個非空但值為0的串。
用戶的輸入<STDIN>
chomp操作
$text=Halineoftext\n";#也可以由<STD工N>輸入
chomp($text);#去掉換行符(\n)。
一步執行:
chomp($text=<STDIN>);#讀入,但不含換行符
chomp是一個函數。作為一個函數,它有一個返回值,為移除的字符的個數。這個數字基本
上沒什么用:
$food=<STDIN>;
Sbetty=chomp$food;#得至U值1
如上,在使用chomp時,可以使用或不使用括號()。這又是Perl中的一條通用規則:除非
移除它們時含義會變,否則括號是可以省略的。
while控制結構
$count=0;
while($count<10){
$count+=2;
print"countisnow$count\nn;
}
undef值
變量被賦值之前使用它會有什么情況發生呢?通常不會有什么嚴重的后果。變量在第一次賦
值前有一個特殊值undef,按照Perl來說就是:〃這里什么也沒有,請繼續〃。如果這里的
“什么也沒有”是一些“數字”,則表現為0。如果是“字符串”,則表現為空串。但undef
既非數字也非字符串,它是另一種標量類型。
defined函數
能返回undef的操作之一是行輸入操作,<STDIN>。通常,它會返回文本中的一行。但如果
沒有更多的輸入,如到了文件的結尾,則返回undefo要分辨其是undef還是空串,可以使
用defined函數,,如果其參數是undef值就返回false,其他值返回true。
$madonna=<STDIN>;
If($defined($madonna)){
print"Theinputwas$madonnan;
}else{
print"Noinputavailable!\n;
)
如果想聲明自己的undef值,可以使用undef:
$madonna=undef;#R]$madonna從未被初始化——樣。
列表和數組
#!/usr/bin/envperl-w
$fred[0]=nyabban;
$fred[l]=ndabban;
$fred[2]="do。”;
print@fred;
?print@fred.n\nH;
qw簡寫
qw!fredbarneybettywilmadino!
qw#fredbarneybettywilmadino##有些像注釋
qw(fredbarneybettywilmadino)
列表賦值
($fredz$barney,$dino)=("flintstone","rubble”,undef);
($fred,$barney)=qw<flintstonerubbleslategranite>;#兩
個值被忽略了
($rocks[Q]r$rocks[1],$rocks[2]z$rocks[3])=qw/talcmica
feldsparquartz/;
當想引用這個數組時,Perl有一種簡單的寫法。在數組名前加@(后沒有中括號)來引用整
個數組。你可以把他讀作〃allofthe〃(所有的)",所以加0^<$可以讀作〃allofthe
rocks(所有的石頭)〃。其在賦值運算符左右均有效:
@rocks=qw/bedrockslatelava/;
@tiny=();#空表
@giant=1..Ie5;#包含100,000個元素的表
@stuff=(@giant,undef,@giant);#包含200,001個元素的表
@dino="granite”;
@quarry=(@rocks,"crushedrock”,@tiny,$dino);
pop和push操作
@array=5..9;
$fred=pop(@array);#$fred得至I」9,@array現在為(5,6,7,8)
Sbarney=pop@array;#$barneygets8,@array現在為(5,6,7)
pop@array;#@array現在為(5,6)(7被丟棄了)
push(@arrayz0);#@array現在為(5,6,0)
push@array,8;#@array現在為(5,6,0,8)
push?array,1..10;#@array現在多了10個元素
@others=qw/90210/;
push@array,@others;#@array現在又多了5個元素(共有19
個)
shift和unshift操作
push和pop對數組的末尾進行操作(或者說數組右邊有最大下標的元素,這依賴于你是怎
樣思考的)。相應的,unshift和shift對一個數組的開頭進行操作(數組的左端有最小下
標的元素)。下面是一些例子:
@array=qw#dinofredbarney#;
$m=shift(@array);#$m得到"din。”,@array現在為
(Hfredn,"barney")
$n=shift@array;#$n得到"fred”,@array現在為
("barney")
shift@array;#@array現在為空
$o=shift@array;#$o得到undefz@arry仍為空
unshift(@array,5);#@array現在為(5)
unshift@array,4;#@array現在為(4,5)
@others=1..3;
unshift@array,@others;#array現在為(1,2,3,4,5)
和pop類似,如果其數組變量為空,則返回undefo
字符串中引用數組
和標量類似,數組也可以插入雙引號的字符串中。插入的數組元素會自動由空格分開:
@rocks=qw{flintstoneslaterubble};
printnquartz@rockslimestone\nH;#輸出為5種rocks由
空格分開
foreach控制結構
foreach$rock(qw/bedrockslatelava/){
print"Onerockis$rock.\n";#打印出3種rocks
)
這里的$rock不是這些列表元素中的一個拷貝而是這些元素本身
最常用的默認變量:$_
如果在foreach循環中省略了控制變量,那Perl會使用其默認的變量:$_。除了其不尋常
的名字外,這和普通變量類似,如下面代碼所示:
foreach(l..10){#使用默認的變量$_
print"Icancountto$_!\nH;
)
$_=nYabbadabbadoo\nH;
print;#打印出默認變量$_
reverse操作
reverse(逆轉)操作將輸入的一串列表(可能是數組)按相反的順序返回。
@fred=6..10;
@barney=reverse(@fred);#得至U10,9,8,7,6
@wilma=reverse6..10;#同上,沒有使用額外的數組
@fred=reverse@fred;#將逆轉過的字符串存回去
sort操作
@rocks=qw/bedrockslaterubblegranite/;
@sorted=sort(@rocks);#得至ljbedrock,
granite,rubble,slate
標量和列表上下文
42+something#something必須是標量
sortsomething#something必須是歹!)表
@people=qw(fredbarneybetty);
@sorted=sort@people;#歹[]表內容:barneyzbetty,fred
$number=42+@people;#標量內容:42+3,得至(J45
另一個例子是reverse。在列表context中,它返回反轉的列表。在標量context中,返回
反轉的字符串(或者將反轉的結果串成一個字符串):
?backwards=reverseqw/yabbadabbadoo/;
#返回doo,dabba,yabba
$backwards=reverseqw/yabbadabbadoo/;
#返回oodabbadabbay
在列表Context中使用Scalar-Producing表達式
如果一個表達式不是列表值,則標量值自動轉換為一個元素的列表:
@fred=6*7;
@barney="hello".1."world";
強制轉換為標量Context
偶爾,你可能需要標量context而Perl期望的是列表。這種情況下,可以使用函數scalar。
它不是一個真實的函數因為其僅是告訴Perl提供一個標量context:
@rocks=qw(talcquartzjadeobsidian);
print"Howmanyrocksdoyouhave?\n;
printT,Ihave”@rocks,"rocks!\n";#錯誤,輸出rocks的名字
printT,Ihave11scalar@rocks,"rocks!\n;#正確,輸出其數字
<STDIN>在列表Context中
@lines=<STDIN>;#將輸入讀入列表context中
chomp(@lines=〈STDIN〉);#讀入所有的行,不包括換行符
子程序
使用sub定義子程序
submarine{
$n+=1;#全局變量$n
print"Hell。,sailornumber$n!\nH;
)
調用子程序
&marine;#輸出Hello,sailornumber1!
^marine;#輸出Hell。,sailornumber2!
^marine;#輸出Hello,sailornumber3!
Smarine;#輸出Hello,sailornumber4!
通常有括號,即便參數為空。子程序將繼承調用者的@的值。
參數
$n=&max(10,15);#此子程序有2個參數
此參數列表被傳到子程序中;這些參數可以被子程序使用。當然,這些參存放在某個地方,
在Perl中,會自動將此參數列表(此參數列表的另一個名字)自動存放在一個叫做⑦的數
組中。子程序可以訪問次數組變量來確定此參數的個數以及其值。這也就是說此子程序參
數的第一個值存放在$_[0]中,第二個存放在$二,依次類推。但必須強調的是這些變量和$_
這個變量沒有任何關系,如$dino,(數組?dino的一個元素)和$布的的關系一樣。這些參數
必須存放在某個數組變量中,Perl存放在魚這個變量中。
submax{
if($_[0]>$_[1]){
$_[0];
}else{
$_[1];
}
my變量
foreach(1..10){
my(Ssquare)=$_*$_;#本循環中的私有變量
printsquaredis$squrare.\n";
)
變量$square是私有的,僅在此塊中可見;在本例中,此塊為foreach循環塊。
當然,my操作不會改變賦值參數的context:
my($num)=#歹U表context,R($sum)=
my$num=#標量context,|n|$num=
使用strictPragma
usestrict;#迫使采用更嚴格的檢測
省略&
有些地方調用子程序可以不要&
my@cards=shuffle(@deck_of_cards);#&是不必要的
輸入和輸出
從標準輸入設備輸入
從標準輸入設備輸入是容易的。使用〈STDINM在標量context中它將返回輸入的下一行:
$line=<STDIN>;#讀入下一行;
chomp($line);#去掉結尾的換行符
chomp($line=<STDIN>)#同上,更常用的方法
于,行輸入操作在到達文件的結尾時將返回undef,這對于從循環退出時非常方便的:
while(defined($line=<STDIN>)){
print”工saw$lineH;
}
從?輸入
尖括號操作(<>)是一種特殊的行輸入操作。其輸入可由用戶選擇
$n=0;
while(defined($line=<>)){
$n+=1;
chomp($line);
print"$n$line\nH;
)
while(<>){
chomp;
print"Itwas$_thatIsaw!\nn;
}
調用參數
技術上講,?從數組@八1^丫中得到調用參數。這個數組是Perl中的一個特殊數組,其包含
調用參數的列表。換句話說,這和一般數組沒什么兩樣(除了其名字有些特別:全為大寫
字母),程序開始運行時,調用參數已被存在@ARGV之中了。
輸出到標準輸出設備
print?array;#打印出元素的列表
print"@array";#打印一個字符串(包含一個內插的數組)
第一個語句打印出所有的元素,一個接著一個,其中沒有空格。第二個打印出一個元素,它為
?array的所有元素,其被存在一個字符串中。也就是說,打印出@@門力丫的所有元素,并由空
格分開。如果@array包含qw/fredbarneybetty/,則第一個例子輸出
為:fredbarneybetty,而第二個例子輸出為fredbarneybetty(由空格分開)。
使用printf格式化輸出
n
printf"Hell。,%s:yourpasswordexpiresin%ddays!\nr
$userz$days_to_die;
printfH%6f\nH42;#輸出為oooo42(。此處指代空格)
printf”%23\n”,2一3+1.95;#2001
數組和printf
my@items=qw(wilmadinopebbles);
my$format="Theitemsare:\n".(n%10s\n"x@items);
printf$format,
等同:
n,,,,
printf"Theitemsare:\n.(%10s\nx@items)r@items;
本處?items有兩個不同的context(上下文),第一次表示元素個數,第二次表示列表
中的所有元素。
句柄(即文件描述符)
Perl自身有六個文件句柄:STDIN,STDOUT,STDERR,DATA,ARGV,ARGVOUT
文件句柄的打開
openCONFIG,"dino”;
openCONFIG,H<dinon
openBEDROCK,"fred”
openLOG,n>>logfilen;
Perl的新版本中(從Perl5.6開始),open支持“3參數”類型:
openCONFIG,udinoH;
openBEDROCK,”>",$file_name;
openLOG,">>"rSlogfile_name();
Bad文件句柄
關閉文件句柄
closeBEDROCK;
嚴重錯誤和die
可以和C中使用perror類似,用die函數:
if(!openLOG,n?logfilen){
die"Cannotcreatelogfile:$!;
)
使用文件句柄
if(!openPASSWD,"/etc/passwd"){
die"Howdidyougetloggedin?($!)";
)
while(<PASSWD>){
chomp;
}
哈希
什么是哈希
和Python的字典一樣
哈希元素的存取
$hash{$somekey}
作為整體的hash
要引用整個hash,使用百分號(“%”)作為前綴。
%some_hash=("foo",35,"bar",12.4,2.5,"hello","wilma",
1.72e30,Hbettyn,nbye\nH);
hash的值(在列表context中)是一個key/value對的列表:
@array_array=%some_hash;
哈希賦值
%new_hash=%old_hash;
%inverse_hash=reverse%any_hash;
大箭頭符號(=?
my%last_name=(
”fred〃=>nflintstone11,
“din。"=>undef,
Hbarneyn=>“rubble”,
“betty"=>"rubble1,,
);
哈希函數
keys和values
my%hash=("a"=>1,=>2,ncn=>3);
my@k=keys%hash;
my@v=values%hash;
each函數
while(($key,$value)=each%hash){
printM$key=>$value\n";
exists函數
if(exists$books{$dino}){
print"Hey,there*salibaraycardfordino!\nn;
delete函數
my$person="betty";
delete$books{$person};#將$persc)n的借書卡刪除掉
正則表達式
簡單的模式
$_="yabbadabbadoon;
if(/abba/){
printnItmatched!\nn;
)
所有在雙引號中的轉義字符在模式中均有效,因此你可以使用/coke\tsprite/來匹配
11個字符的字符串coke,tab(制表符),sprite。
元字符
9
+
*
模式中的分組
/fred+/#只能匹配fredddddd等
/(fred)+/#能匹配fredfredfred等
/(fred)*/#可以匹配“hello,world”,因為*是匹配前面的0或多次
選擇符(I)
/fred|barneyIbetty/
/fred(|\t)+barney/
字符類
指口中的一列字符。
字符類的簡寫
\d==[0-9]
\w==[A-Za-z0-9_]
\s==[\f\t\n\r]#格式符(form-feed)、制表符(tab)、換行符、
回車
簡寫形式的補集
\D==[A\d]
\W==[A\w]
\S==[A\s]
可以組合:
[\d\D]#任何數字和任何非數字,可以匹配所有字符!比如.是不能匹配所
有字符的
[A\d\D]#無用
正則表達式的應用
使用m//匹配
同qw//一樣,可以使用任何成對字符,比如可以使用m(fred),m<fred>,m{fred),
m[fred],或者m,fred,,mlfred!,m"fred”。
如果使用/作為分隔符,可以省略前面的m
如果使用配對的分隔符,那不用當心模式內部會出現這些分隔符,因為通常模式內部的分
隔符也是配對的。因此,m(fred(.*)barney),m{\w{2,}},m[wilma[\n\t]+betty]是正確
的。對于尖括號(〈和>),它們通常不是配對的。如模式m{(\d+)\s*>=?\s*(\d+)},如果使用
尖括號,模式中的尖括號前因當使用反斜線(\),以免模式被過早的結束掉。
可選的修飾符
不區分大小寫:/i
if(/yes/i){#大小寫無關
printnInthatcase,Irecommendthatyougobowling.\nH;
匹配任何字符:/s
使用/s這個修飾符,它將模式中點(.)的行為變成同字符類[\d\D]的行為類彳以:可以
匹配任何字符,包括換行符。從下例中可見其區別:
$_="IsawBarney\ndownatthebowingalley\nwithFred\nlast
night.\n;
if(/Barney.*Fred/s){
print“ThatstringmentionsFredafterBarney!\nn;
添加空格:/x
/x修飾符,允許你在模式中加入任何數量的空白,以方便閱讀:
/-?\d+\.?\d*/#這是什么含義?
/-?\d+\.?\d*/x#要好些
Perl中,注釋可以被作為空白,因此使用/x,可以在模式中加上注釋:
/
-?#可選的負號
d+#小數點前一個或多個十進制數字
\.?#可選的小數點
\d*#小數點后一些可選的十進制數字
/x#模式結束
使用多個修飾符
if(/barney.*fred/is/){#/i和/s
print"ThatstringmentionsFredafterBarney!\n";
錨定
八開頭
$結尾
注意:/fred$/能同時匹配上"fred”和〃fred'n"。
"\s*$/#匹配空行
詞錨定:\b
/\bfred\b/可以匹配單詞"fred",但不能匹配"frederick"
綁定操作符:=~
對$_進行匹配只是默認的行為,使用綁定操作符(=~)將告訴Perl將右邊的模式在左
邊的字符串上進行匹配,而非對$_匹配。
my$some_other="Idreamofbettyrubble.";
if($some_other=~/\brub/){
print"Aye,there'stherub.\n";
)
綁定操作符優先級較高:
my$likes_perl=<STDIN>=~/\byes\b/i;
匹配變量
$_="Hellothere,neighbor',;
if(/\s(\w+),/){#空格和逗號之間的詞
print"Thewordwas$l\nu;
}
自動匹配變量
$整個被匹配的部分
$、#匹配部分的前一部分存放在$'之中
$'#后一部分被存到$,
使用正則表達式處理文件
使用S///進行替換
$_="He'soutbowlingwithBarneytonight.n;
s/Barney/Fred/;#Barney被Fred替換掉
print”$\nH;
#接上例:現在$_為HHe1soutbowlingwithFredtonight.H
s/Wilma/Betty/;#用Wilma替換Betty(失敗)
s/with(\w+)/agaist$1*steam/;
print;#為"He1soutbowlingagainst
Fred*steamtonight.n;
使用/g進行全局替換
$_="home,sweethome!H;
s/home/cave/g;
printu$_\n";#"cave,sweetcave!”
全局替換的一個常用地方是將多個空格用單個空格替換掉:
$_=HInputdata\tmayhaveextrawhitespace.n;
s/\s+//g;#現在是HInputdatamayhaveextra
whitespace.”
現在已經知道怎樣去掉多余的空格,那怎樣去掉開頭和結尾的空白呢?這是非常容易的:
s/A\s+//;#將開頭的空白去掉
s/\s+$//;#將結尾的空白去掉
sb\s+|\s+$//g;#將開頭,結尾的空白去掉
不同的分隔符
如同m〃和qw〃一樣,我們也可以改變s/〃的分隔符。但這里使用了3個分隔符,因此有
些不同。
s#Ahttps://#http://#;
如果使用的是配對的字符,也就是說其左字符和右字符不的,則必需使用兩對:一對存放模
式,一對存放替換的字符串。此時,分隔符甚至可以是不同的。事實上,分隔符還可以使用普
通的符號(非配對的)。下面三例是等價的:
s{fred}{barney};
s[fred](barney);
s<fred>#barney#;
可選的修飾符
除了/g修飾符外,替換操作中還可以使用/i,/X,和/s,這些在普通的模式匹配
中己經出現過的修飾符。其順序是無關緊要的。
s#wilma#Wilma#gi;#將所有的WilmA,或者WILMA等等,
由Wilma替換掉
s{___END___.*}{}s;#將END標記及其后面的行去掉
綁定操作
同m//一樣,我們也可以通過使用綁定操作符改變s///的替換目標:
$file_name=~s#^.*###s;#將$“16_112111?中所有的
Unix類型的路徑去掉
大小寫替換
有時,希望確保被替換的字符串均是大寫的(或者不是,視情況而定)。這在Perl中只需使
用某些修飾符就能辦到。\U要求緊接著的均是大寫:
$_="工sawBarneywithFred.";
s/(fred|barney)/\U$l/gi;#$_現在是HIsawBARNEYwith
FRED.”
同樣,也可以要求后面的均為小寫\L:
s/(fred)|barney/\L$l/gi;#$_現在是"工sawbarneywith
fred.n
默認時,會影響到剩余的(替換的)字符串。可以使用\E來改變這種影響:
s/(\w+)with(\w+)/\U$2\Ewith$1/1;#$1現在是HIsawFRED
withbarney.n
使用小寫形式時(\1和\u),只作用于下一個字符:
s/(fred|barney)/\u$l/ig;#$_現在是"工sawFREDwith
Barney.H
也可以同時使用它們。如使用\U和\L表示"第一個字母大寫,其它字母均小寫"。\L和\u
可以按任意順序出現。Larry意識到人們有時可能按相反順序使用它們,因此他將Perl設
計成,在這兩種情況下都是將第一個字母大寫,其余的小寫?Larry是個非常好的人。
s/(fred|barney)/\u\L$l/ig;#$_現在為"IsawFredwithBarney."
這些在替換中出現的大小寫轉換的修飾符,也可在雙引號中使用:
print"Hello,\L\u$name\E,wouldyouliketoplayagame?\n";
split操作
另一個使用正則表達式的操作是split,它根據某個模式將字符串分割開。這對于由制表
符分割開,冒號分割開,空白分割開,或者任意字符分割開的數據是非常有用的。任何可在正
則表達式之中(通常,是一個簡單的正則表達式)指定分離符(separator)的地方,均可用
splito其形式如下:
?fields=split/separtor/,$string;
@fields=split/:/,"abc:def:g:h";#返回("abc","def",
"g","h")
/\s+/這個模式分隔符非常常見:
my$some_input="Thisisa\ttest.\n";
my@args=split/\s+/,$some_input;#("This","is",
"a","test.")
默認時,split對$_操作,模式為空白:
my@fields=split;#同split/\s+/,$_;
join函數
join函數不使用模式,但它完成同split相反的操作:split將一個字符串分割開,而
join函數將這些分割的部分組合成一個整體。join函數類似于:
my$result=join$glue,@pieces;
join函數的第一個參數是粘合元素(glue),它可以是任意字符串。剩下的參數是要被粘合的
部分。join將粘合元素添加在這些部分之間,并返回其結果:
my$x=join4,6,8,10,12;#$x為n4:6:8:10:12n
列表上下文中的m//
在列表context中使用模式匹配(m〃)時,如果匹配成功返回值為內存變量值的列表;如果
匹配失敗則為空列表:
$_="Hellothere,neighbor!";
my($firstf$secondz$third)=/(\S+)(\S+),(\S+)/;
print''$secondismy$third\nz,;
在s///中介紹的/g修飾符也可在m//中使用,它允許你在字符串中的多處進行匹配。
在這里,由括號括起來的模式將在每一次匹配成功時返回其內存中所存放的值:
my$text="Freddroppeda5tongraniteblockonMr.Slate";
my@words=($text=~/([a-z]+)/ig);
print"Result:@words\nH;
#Result:FreddroppedatongraniteblockonMrslate
如果有不止一對括號,每一次返回不止一個字符串。例如將字符串放入hash中,如下:
my$data="BarneyRubbleFredFlintstoneWilmaFlintstone";
my%last_name=($data=~/(\w+)\S+(\w+)/g);
每當模式匹配成功時,將返回一對值。這些一對一對的值就成了hash中的key/value對。
更強大的正則表達式
非貪婪的數量詞
各符號對應的非貪婪匹配:
+->/fred.+?barney/
*—>s#<BOLD>(.*?)</BOLD>#$l#g;
{5,10}?
{8,}?
?—>??
在命令行進行修改
$perl-p-i.bak-w-e1s/Randall/Randal/g1fred*.dat
-p要求Perl為你寫一個程序。它算不上是一個完整的程序;看起來有些像下面的:
while(<>){
print;
}
更多控制結構
unless控制結構
在if控制結構中,只有條件為真時,才執行塊中的代碼。如果你想在條件為假時執行,可以
使用unless:
unless($fred=~/A[A-Z_]\w*$/i){
print"Thevalueof\$freddoesn'tlooklikeaPerlidentifier
name.\nH;
}
unless的含義是:除非條件為真,否則執行塊中的代碼。這和在if語句的條件表達式前
面加上!(取反)所得結果是一樣的。
另一種觀點是,可以認為它自身含有else語句。如果不太明白unless語句,你可以把它
用if語句來重寫(頭腦中,或者實際的重寫):
if($fred=~/A[A-Z_]\w*$/i){
#什么也不做
}else{
print"Thevalueof\$freddoesn'tlooklikeaPerlidentifier
name.\nn;
unless和else一起
unless($mon=~/人Feb/){
print"Thismonthhasatleastthirtydays.\n";
}else{
printnDoyouseewhat1sgoingonhere?"";
也可以同時使用它們
until控制結構
有時,希望將while循環的條件部分取反。此時,可以使用until:
until($j>$i){
$j*=2;
}
表達式修飾符
為了得到更緊湊的形式,表達式后可以緊接控制修飾語。如,if修飾語可以像if塊那樣使
用:
printH$nisanegativenumber.\nnif$n<0;
等同下面代碼:
if($n<0){
print"$nisanegativenumber.\nH;
}
雖然被放在后面,條件表達式也是先被求值的。這和通常的的從左到右的順序相反。耍理
解Perl代碼,應當像Perl內部的編譯器那樣,將整個語句讀完,來其具體的含義。
還有一些其它的修飾語:
&error("Invalidinput")unless&valid($input);
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 菏澤市重點中學2025年高三第二次調研測試物理試題理試題含解析
- 河南焦作市沁陽市2025屆初三年級第一次質量調研生物試題試卷含解析
- 浙江機電職業技術學院《特效化妝工藝》2023-2024學年第一學期期末試卷
- 紅色簡約商務風季度績效考核報告
- 電機在醫療放射設備中的應用考核試卷
- 森林公園生態旅游市場品牌建設與競爭力提升考核試卷
- 煤氣化中的智能化制造技術發展前景考核試卷
- 工程質量事故分析總復習考核試卷
- 液壓技術在物料搬運設備中的重要性考核試卷
- 2025屆上海市長寧區高三二模考試數學試卷
- 供應鏈優化與協同計劃書
- 【比亞迪汽車公司股權激勵對績效的影響分析案例報告(11000字論文)】
- 文星幼兒園收費標準
- 六年級綜合實踐《我們的傳統節日》
- 數字會議系統現場檢驗內容與標準
- 北京市朝陽區2022-2023學年高三上學期期中語文試卷各個模塊講評 課件
- 桂林市臨桂區中小學教師招聘筆試試題2023年
- 方證歌訣【執業中醫師中醫內科】
- 學習浙江《千萬工程》經驗全文PPT
- 機電工程技術標投標方案
- DB31 SW-Z 017-2021 上海市排水檢測井圖集
評論
0/150
提交評論