歡迎關(guān)注公眾號(hào):oddxix
最近算是系統(tǒng)的學(xué)完了perl了合搅,一下是對(duì)小駱駝的整理贬媒,感謝博主鐵漢柔情1990的perl筆記粉私。
接下來幾天系統(tǒng)學(xué)完Linux就可以入手Python了惫谤,有點(diǎn)小緊臟嘻嘻
1.perl入門
perl全名是practical extraction and report language,實(shí)用摘錄于報(bào)表語(yǔ)言壁顶。主要用于文字處理,具有容易使用溜歪,不受限制若专,速度快,代碼有點(diǎn)難看等特點(diǎn)蝴猪。我覺得最牛逼的地方在于他是不封閉的调衰,你可以看到他的代碼。
腳本的編寫:
例1:
#自阱! /usr/bin/perl
print "hello,world!\n";
#嚎莉! /usr/bin/perl
use 5.010
say "hello,world!";
第一行#! /usr/bin/perl的意思是使用/usr/bin目錄下的Perl來解讀下面的程序,其中#沛豌!是一個(gè)特殊注釋符趋箩,一般的#是普通的注釋符,從開始到行結(jié)尾的部分加派,普通的注釋符是沒有啥意義的叫确,就是在程序里面一個(gè)簡(jiǎn)單說明說明,方便其他人來讀你的程序的時(shí)候更容易理解芍锦。 一般perl都是在/usr/bin這個(gè)目錄下启妹,如果不在記得修改其地址,當(dāng)然還可以通過#! /usr/bin/envperl來幫你定位perl
這是兩個(gè)代碼醉旦,但輸出的結(jié)果一樣饶米。\n是換行符的意思,打出這個(gè)結(jié)果后车胡,光標(biāo)落在下一行檬输,而用say就可以不用輸入\n而自動(dòng)換行,但是有一個(gè)條件匈棘,必須是perl 5.10版本以后丧慈,如果不是就,就得提醒一下主卫,通過use 5.010告訴解釋器逃默,但是解釋器識(shí)別的是小數(shù)點(diǎn)后三位,所以perl 5.10版本得寫成5.010
這里可以通過perl -v來看你版本簇搅,我的是5.14.2
腳本的命名:
Perl程序并不需要什么特殊的文件名或拓展名完域,甚至不用拓展名就最好不要用。就是怕用其他的程序改寫后以免引起誤解瘩将。但是呢吟税,我一般還是會(huì)用.pl凹耙,至少提醒自己這個(gè)文件是一個(gè)腳本啊,你覺得呢
腳本的運(yùn)行:
你可以直接在終端中 :perl my_pro.pl #my_pro是你編寫的腳本的名字
也可以chmod a+x my_pro 把該文件變成一個(gè)可執(zhí)行的程序肠仪,然后cd到該文件夾肖抱,同多./my_pro來運(yùn)行,淡然如果是可執(zhí)行的文件异旧,在修改的時(shí)候得注意了意述,我之前提到過,打開后i修改吮蛹,esc后欲险, :wq來保存
CPAN
comprehensive perl archive network,里面有很多perl的源代碼匹涮,各種下載
2.Perl--標(biāo)量變量
Perl標(biāo)量(scalar)是稱呼單個(gè)的事物,可以是數(shù)字槐壳,也可以是字符串然低。變量即為存儲(chǔ)一個(gè)或多個(gè)值的容器的名稱。標(biāo)量變量為僅僅存放一個(gè)值的變量务唐。
首先雳攘,我們來聊一下perl常見的單引號(hào)雙引號(hào)的區(qū)別:
1,兩者都是用來讓perl識(shí)別字符串的開始和結(jié)尾 “fred”和‘fred’效果一樣
2枫笛,單引號(hào) 也只有在反斜線后面接單引號(hào)或反斜線時(shí)吨灭,才表示轉(zhuǎn)義。要使用\則需要在前面加一個(gè)\來轉(zhuǎn)義刑巧,要使用'則需要在前面加一個(gè)\來轉(zhuǎn)義喧兄,例如:‘\'\\' 表示單引號(hào)后接一個(gè)反斜線
3,雙引號(hào) 一般用作轉(zhuǎn)義或這是使用變量?jī)?nèi)插
\在里面有很強(qiáng)的轉(zhuǎn)義功能啊楚,比如\n表示換行吠冤,一般結(jié)尾都需要來個(gè)這個(gè)
\f換頁(yè) ……
$meal="bro steak";
$barney="fred ate a $meal";
$barney='fred ate a'.$meal; 這兩種寫法效果一樣,其中.表示為鏈接字符串的操作符恭理。所以上面那個(gè)看上去更簡(jiǎn)潔嘛
結(jié)合著例子來說明吧
第一個(gè)例子:提示用戶輸入半徑來求周長(zhǎng)
#拯辙! /usr/bin/perl #告訴腳本Perl在哪里運(yùn)行
use warnings; #有錯(cuò)誤的話,就提醒颜价,也可以跟上面合并#涯保! /usr/bin/perl -w
$pi=3.141592654; #定義標(biāo)量變量$pi的值為
print "What is the radius?"; #提示輸入半徑
chomp($radius=); #為行輸入,其返回的字符串一般在末尾都會(huì)有換行符周伦,如果字符串后面有兩個(gè)以上的換行符夕春,chomp()僅僅刪除一個(gè)
print "The circumeference of acircle of radius $radius is $circ.\n"; #后面不輸入\n的話結(jié)果末尾光標(biāo)提示有誤
第二個(gè)例子:當(dāng)輸入的半徑小于0時(shí),輸出的結(jié)果為0专挪,不為負(fù)數(shù)撇他。
#茄猫! /usr/bin/perl
use warnings;
$pi=3.141592654;
print "What is the radius?";
chomp($radius=);
$circ=$pi*2*$radius;
if($radius<0){
print "0\n"
}else{
print "The circumeference of acircle of radius $radius is $circ.\n";
}
這里面就是多了一個(gè)if語(yǔ)句,如果()里面的困肩,就怎樣划纽,否則……
第三個(gè)例子:提示用戶輸入兩個(gè)數(shù)字,然后輸出兩者的乘積
#锌畸! /usr/bin/perl
use warnings;
print "What is the one?";
chomp($one=);
print "What is the two?";
chomp($two=);
$three=$one*$two;
print "The result is $three\n";
第四個(gè)例子:提示輸出一個(gè)字符串和一個(gè)數(shù)字勇劣,使用x操作符
#! /usr/bin/perl
use warnings;
print "plese enter a string:";
chomp($one=);
print "please enter a number of times:";
chomp($two=);
$three=$one x $two;
print "The result is $three\n";
each操作符:
my @rocks=qw / bedrock slate rubble granite/;
while(my($index,$value)=each @rocks){
say"$index:$value";
}
每次對(duì)數(shù)組調(diào)用each潭枣,會(huì)返數(shù)組中下一個(gè)元素所對(duì)應(yīng)的兩個(gè)值--該元素的索引以及各該元素的值
3.perl--列表和數(shù)組
列表是標(biāo)量的有序集合比默,數(shù)組是存儲(chǔ)列表的變量。數(shù)組或列表中的每個(gè)原書都是單獨(dú)的標(biāo)量變量盆犁,擁有獨(dú)立的標(biāo)量值命咐,這些值是有序的,也就說谐岁,從開始到終止元素的先后次序是固定的醋奠。并且每個(gè)元素都有相應(yīng)的整數(shù)作為索引,此數(shù)字從0開始遞增伊佃,每次加1.
還是來案例來理解這一節(jié)的東西吧窜司。
1,寫入一個(gè)程序航揉,讀入一些字符串(每行一個(gè)塞祈,)直到文件結(jié)尾位置,然后帅涂,再以相反的順序輸出這個(gè)列表议薪。
#! /usr/bin/perl
use warnings;
print "please enter your string,then press Ctrl+D:\n";
@lines=;
@a=reverse @lines;
print @a;
#在列表上下文中,會(huì)返回所有剩下的行媳友,知道文件結(jié)尾為止笙蒙,
#通常可以鍵入Control+D來告知系統(tǒng)庆锦,不會(huì)有任何輸入了(對(duì)于DOS/Windows來說捅位,要用Control+Z)
reverse操作符會(huì)讀取列表或數(shù)組的值,并按相反的次序返回該列表搂抒,這個(gè)是對(duì)..很好的補(bǔ)充艇搀,因?yàn)?..10代表6到10,但其中..只表示遞增的關(guān)系求晶。
2寫一個(gè)程序焰雕,讀入一數(shù)字(每行一個(gè)),直到文件結(jié)尾為止芳杏,然后根據(jù)每一個(gè)俗子輸入的如下名單中相應(yīng)的人名矩屁。
#! /usr/bin/perl
use warnings;
print "please enter some numbers from 1 to 7,one per line,then press Ctrl-D:\n";
chomp(@a=);
@b=qw(fred betty barney dino wilma pebbles bamm-bann);
foreach $_ (@a){
print "$b[$_-1]\n";
};
#chomp會(huì)自動(dòng)去掉每個(gè)元素的換行符
qw表示quoted word辟宗,perl會(huì)把其當(dāng)作單引號(hào)的內(nèi)的字符串來處理,所以qw構(gòu)建的列表中吝秕,不能像雙引號(hào)內(nèi)的字符一樣用\n或$fred.其中的空白符(如空格泊脐,制表符,換行符)烁峭,同時(shí)還容許其他任何標(biāo)點(diǎn)符號(hào)作為定界符容客,只要左右的相同,同時(shí)如果你要在被圈引的字符串內(nèi)使用定界符约郁,還可以通過反斜線轉(zhuǎn)義來引入這個(gè)字符缩挑。
foreach $_ ()就是一個(gè)個(gè)的找()內(nèi)的單個(gè)字符串,然后單個(gè)的字符串定義為$_,其中$_是默認(rèn)的鬓梅,可以不寫供置,后面默認(rèn),同時(shí)也可以寫使用其他的標(biāo)量變量绽快。
$b[$_-1]表示取數(shù)組@b中的第$_個(gè)元素芥丧。無(wú)論是列表還是數(shù)組,其索引都是從0開始的谎僻,所以數(shù)組中對(duì)應(yīng)的第一個(gè)對(duì)象的索引號(hào)為0,對(duì)于@a其最大的索引為$#a,注意這個(gè)數(shù)會(huì)比數(shù)組元素的個(gè)數(shù)少1.還有一個(gè)“負(fù)數(shù)數(shù)組索引值”寓辱,最后一個(gè)元素的索引值為-1艘绍,倒數(shù)第二個(gè)為-2,一次類推秫筏。
@b數(shù)組名只能包含標(biāo)量诱鞠,不能包含其他數(shù)組,所以數(shù)組無(wú)法成為列表里的元素这敬,只能展開生成元素列表航夺。
3,讀入一些字符串(每行一個(gè))崔涂,知道文件結(jié)尾為止阳掐,然后按ASCII碼順序來輸出所有的字符串。
輸出的結(jié)果在一行
#! /usr/bin/perl
use warnings;
print "please enter some some strings,one per line,then press Ctrl-D:\n";
chomp(@a=);
@b=sort @a;
print "@b\n";
輸出的結(jié)果在不同的行
#! /usr/bin/perl
use warnings;
print "please enter some some strings,one per line,then press Ctrl-D:\n";
chomp(@a=);
@b=sort @a;
foreach $b(@b) {
print "$b\n";
}
其中sort就是一個(gè)排序操作符冷蚂,規(guī)則是大寫字符在小寫字符前面缭保,數(shù)字排在字母前面,標(biāo)點(diǎn)符號(hào)散落各地蝙茶,但100艺骂,99的排序的時(shí)候還是100,99隆夯,因?yàn)楦鶕?jù)默認(rèn)的排序規(guī)則钳恕,任何以1開頭的字符串會(huì)被排在以9開頭的字符串之前别伏。
4.perl--數(shù)組中元素的修改
對(duì)尾部:
pop操作符負(fù)責(zé)取出數(shù)組中最后一個(gè)元素并將其作為返回值返回。
@a=5..9
@b=pop@a
其@b為9忧额,@為5..8
或者直接pop@a,也就是刪掉@a的最后一個(gè)元素
push操作符厘肮,用來加入一個(gè)元素(或是一串元素)到數(shù)組的尾端。
push @a,5; #數(shù)組a中最后一個(gè)元素加入5
@b=qw/ 9 0 9 0 3/;
push @a,@b; @a得到了5個(gè)新元素
對(duì)頭部:
$a=shift (@b); #@b前一個(gè)元素丟失宙址,$a為其第一個(gè)元素
unshift同理push
unshift @arrary,@others
對(duì)整體:
替換和刪除
@a=splice @b,2,4,qw(c b d)
其中@b為處理的數(shù)組轴脐,2代表的是要操作的一組元素開始位置,其指示索引值抡砂,相當(dāng)于把光標(biāo)放在了第二個(gè)元素的后面大咱,如果僅僅就給出前面兩個(gè)參數(shù),perl會(huì)從給定位置開始一直到末尾的全部元素提取出來并返回注益。其中4為指定操作的長(zhǎng)度碴巾。qw(c b d)為要替換的列表,替換的長(zhǎng)度不一定要跟拿走的長(zhǎng)度相等丑搔。
@ab=qw(a b c d e);
@removed=splice @ab,1,2,qw(will);
#刪除b,c ;@removed變成(b c);@ab變成qw(a will d e)
增加:
@array=qw( pebbles dino fred barney betty);
@removed=splice @array,1,0,qw(wilma);
#什么元素都不刪厦瓢,@removed變成了qw();@array變成了qw(pebbles wilma dino ...)
5.Perl--子程序
Perl可以讓你創(chuàng)建子程序,它讓我們可以重復(fù)利用已有的代碼
例1:寫一個(gè)求和的子程序啤月,同時(shí)檢驗(yàn)
#! /usr/bin/perl
use strict; #告訴perl內(nèi)部的編譯器的代碼應(yīng)該稍微嚴(yán)謹(jǐn)一些煮仇。也可以通過use 5.012隱式打開,
use warnings;
sub total{ #要定義自己的子程序谎仲,可以通過sub,子程序名浙垫,花括號(hào)封閉起來
my $sum=0;
foreach (@_){
$sum +=$_;
}
$sum;
}
my @fred =qw(1 2 5 7 9);
my $fred_total=&total(@fred); #通過&來調(diào)用子程序,如果不引起歧義郑诺,可以省略&夹姥。()里面是
print "The total of \@fred is $fred_total.\n"; 參數(shù)
print "Enter some numbers on seperate lines:";
my $user_total=total();
print "The total of those numbers is $user_total.\n";
所有的子程序都有一個(gè)返回值--子程序并沒有“有返回值”或“沒有返回值”之分。但并不是所有的在子程序的返回值都是有用的辙诞。最后一次結(jié)果都將自動(dòng)當(dāng)初子程序的返回值辙售。在子程序里添加額外的程序代碼時(shí),請(qǐng)小心檢查最后執(zhí)行的表達(dá)式是哪一個(gè)飞涂,確定它是你要的返回值旦部。
子程序自動(dòng)將參數(shù)存在了@中,其中第一個(gè)參數(shù)為$[0],第二個(gè)為$[1],一次類推较店,這些變量和$沒有任何關(guān)系志鹃。其中@_為子程序的私有變量。
perl里面所有的變量都都是全局變量泽西,在程序的任何地方都可以訪問他們曹铃。可以借助my來創(chuàng)建私有變量捧杉。這些變量屬于子程序封閉語(yǔ)句塊所有陕见,其他地方使用不受影響秘血。my barney,只能申明第一個(gè)為私有變量。
return,子程序執(zhí)行到一半的時(shí)候停止執(zhí)行:
sub which_element_Is{
my($what,@array)
foreach (0..$#array)
if ($what eq $array[$_]){
return $_;
}
}
-1;
}
例2:找出大于平均值的數(shù)
#! /usr/bin/perl
use warnings;
use strict;
sub average{
my $sum=0;
my $n=0;
my $average;
foreach (@_){
$sum +=$_;
$n +=1; #也可以通過$n=@_來知道含有多少個(gè)元素评甜。
}
$average=$sum/$n;
}
sub above_average{
my @lists; #定義私有變量
my $a=&average(@_); #調(diào)用上面的子程序
foreach (@_) {
if ($_>$a){
push @lists,$_; #push往首先加元素
}
}
@lists;
}
my @fred=&above_average(1..10);
print "\@fred is @fred\n";
例3:記錄之前都來了那些人
#! /usr/bin/perl
use warnings;
use strict;
use 5.010;
sub greet{
state @names;
my $name=shift;
print"hi $name!";
if (@names){
print "I've seen:@names\n";
}
else{
print "You are the first one here!\n";
}
push @names,$name;
}
greet('fred');
greet('barney');
greet('wilma');
6.Perl--輸入和輸出
前面已經(jīng)提到$line=,@line=灰粮,即可以過多鍵盤輸入的東西進(jìn)入到程序中去運(yùn)行。<>是另一種讀取的方式忍坷,鉆石操作符是行輸入操作符的特例粘舟,它不是從鍵盤輸入,而是從用戶指定的位置讀取佩研。
while(defined($line=<>)){
chomp($line);
print "It was $line that I saw!\n";
}
也可以簡(jiǎn)寫為
while(<>){
chomp;
print"It was $_ that I saw!\n";
鉆石操作符是用來讀取輸入的柑肴,而輸入的內(nèi)容可以在$_中找到。
鉆石操作符會(huì)先查看數(shù)組@ARGV旬薯,然后決定該用那些文件名晰骑,如果它找到的是空列表,就會(huì)改用標(biāo)準(zhǔn)輸入流绊序,例如在前面的程序中加入@ARGV=“”硕舆,它就只會(huì)去讀這里面的文件了。
print @arrary;
print "@arrary";
第一個(gè)print語(yǔ)句會(huì)一個(gè)接一個(gè)地打印出數(shù)組中的所有的元素骤公,元素之間不會(huì)有空格抚官,比如@arrary=qw"fred barney betty",第一個(gè)語(yǔ)句輸出的是fredbarneybetty,而第二個(gè)輸出的是空格隔開的fred barney betty.
如果有換行符,建議還是用第一種阶捆,如果不含換行符凌节,用第二種,當(dāng)然后面可以加\n
printf操作符的參數(shù)包含“格式字符串”以及“要輸出的數(shù)據(jù)列表”
例如:printf "Hello,$s;your password expires in %d days!\n",$user,$days_to_die;
出來的結(jié)果是:Hello,merlyn;your password expires in 3 days!
最常用的格式:
恰當(dāng)?shù)臄?shù)字格式:
printf "g% %g %g\n",5/2,51/17,51**17 # %g會(huì)按需要自動(dòng)選擇浮點(diǎn)數(shù)趁猴,整數(shù)甚至指數(shù)形式
print "in %d days !\n",17.58 #%d代表十進(jìn)制的整數(shù)刊咳,無(wú)條件的曲調(diào)小數(shù)點(diǎn)后面的數(shù)字
** 字符的格式**:
printf "m\n",42 #輸出的結(jié)果看起來像····41(其中·代表空格)
printf "s\n","wilma"; #看起來像·····wilma
printf "%-10s\n","wilma"; #負(fù)號(hào)是左對(duì)齊彪见,結(jié)果為wilma·····
printf ".3f\n",6*7+2/3 #%f按需要四舍五入儡司,可以指定字段寬度和小數(shù)點(diǎn)位數(shù)結(jié)果為 ······42.667
要輸出真正的%,請(qǐng)用%%
print"%.2f%%\n"余指,5.25/12; # 結(jié)果為0.44%
**數(shù)組的格式**:
$format="The items are :\n".("%${width}s\n"x@string); #${width}為變量指定的字符寬度捕犬,為了 printf $format,@string;格式: 避免混淆,加了{(lán)}
文件句柄
代表perl進(jìn)程與外鍵之間I/O聯(lián)系的名稱酵镜,僅僅是聯(lián)系的房產(chǎn)碉碉,不是文件的名稱。建議用全大寫字母來命名文件句柄淮韭。跟已有的文件柄:STDIN,DTDOUT,STEERR,DATA,ARGV,ARGVOUT不要重名垢粮,其他的可以選擇自己喜歡的名字。
方式1: perl tac2 <> uuu
方式2 ./tac2 <> uuu
其中tac2為寫的腳本靠粪, <>中的m為輸入的文件 ,uuu為你存放生成的結(jié)果的文件名蜡吧,可以自己取名字毫蚓。
打開文件句柄:
open CONFIG,'dino';
open CONFIG,'
open BEDROCK,'.fred';
open LOG,'>>logfile';
第一行打開名為CONFIG的文件句柄,讓它指向文件dino,也就是打開文件dino,文件中的任何內(nèi)容都可以從文件句柄CONFIG被督導(dǎo)我們的程序中來昔善。
第二行申明此文件用來讀取的元潘,而非寫入的
第三行用來創(chuàng)建一個(gè)新的文件,打開文件句柄BEDROCK君仆,并輸入到新的文件fred中翩概,如果已有該文件,就清除重新建
第四行用來追加的方式打開文件返咱,
open的三個(gè)參數(shù)形式:
open CONFIG,'<','dino';
open BEDROCK,'>',$file_name;
open LOG,'>>',&logfile_name();
這種寫法的好處就在于钥庇,可以在文件操作模式后面加上冒號(hào),寫上編碼名稱
open CONFIG,'<:encoding(UTF-8)','dino';
關(guān)閉文件句柄
close BEDROCK;
通知系統(tǒng)將尚未寫入的輸出數(shù)據(jù)寫到磁盤洛姑,顯得工整一些
改變默認(rèn)的文件輸出句柄:
select LOG; #選擇LOG作為輸出的文件句柄
$| =1; #輸出操作之后立刻刷新緩沖區(qū)
select STDOUT; #回復(fù)到默認(rèn)的輸出文件句柄STDOUT;
print LOG "This is very good!\n";
例1:反向輸出
#! /usr/bin/perl
use warnings;
use strict;
use 5.010;
my @line=<>;
chomp @line;
my @b=reverse(@line);
print "@b\n";
當(dāng)我在終端運(yùn)行這個(gè):perl tac m n (m,n為保存有字符串的文件)
為什么沒有反向輸出的效果呢上沐?求解
當(dāng)把里面的@改成$后,可以對(duì)單個(gè)文件處理楞艾,反向輸出参咙,這是個(gè)什么原因呢?
例2:用戶自定義輸出的字符寬度:
#! /usr/bin/perl
use warnings;
use strict;
my $width;
print"Please enter the number of size,the enter Ctrol +D to end:\n";
$width=<>;
chomp $width;
print"please enter the string,the enter Ctrol +D to end:\n";
my @string=<>;
chomp @string;
my $format="%${width}s\n"x@string;
printf $format,@string;
7.perl--哈希
哈希是一種數(shù)據(jù)結(jié)構(gòu)硫眯,它和數(shù)組的相似之處 在于可以容納任意多的值并能按需取用蕴侧,而它和數(shù)組的不同在于索引方式,數(shù)組以數(shù)字來索引两入,哈希則是以名字來索引净宵。哈希的索引值為鍵(key),并不是數(shù)字,而是任意唯一的字符串裹纳。這些鍵和值都是任意的標(biāo)量择葡,但鍵總會(huì)被轉(zhuǎn)換為字符串。即使哈希包含300萬(wàn)個(gè)鍵值對(duì)剃氧,從中提取任意的一項(xiàng)數(shù)據(jù)還是會(huì)和原來一樣快敏储。但鍵則必須是唯一的字符串。
它有什么用呢朋鞍?
按名字找姓
按主機(jī)名找IP
按IP找主機(jī)名
按單詞統(tǒng)計(jì)其出現(xiàn)次數(shù)(用的比較多)
按用戶名統(tǒng)計(jì)每個(gè)人使用
說白了已添,哈希就是個(gè)極其簡(jiǎn)單的數(shù)據(jù)庫(kù)。
訪問哈希元素: $family_name{'fred'}='flintstone';
這和數(shù)組的做法類似滥酥,只是使用了花括號(hào)而非方括號(hào)來表示索引值
哈希變量的命名不可以用數(shù)字開頭更舞。
訪問整個(gè)哈希 :
%some_hast=('foo',35,'bar',12.4,2.4,'helllo','wilma',1.72,'betty',"bye\n");
對(duì)哈希的賦值,等同于在列表上下文中賦值坎吻,列表中的元素應(yīng)該為鍵值對(duì)缆蝉。
也可以通過 my$inverse_hash=reverse %any_hash 把鍵值對(duì)給范徐過來,最好確認(rèn)值也是唯一的在使用,不然會(huì)弄錯(cuò)刊头。
my %last_name=(
'fred' => 'flintstone',
'dino' => undef,
barney=>'rubble',
betty =>'rubble',
);
任何需要逗號(hào)的地方都可以用胖箭頭來替代贝搁,這對(duì)perl來說,并沒有多大的區(qū)別芽偏。使用胖箭頭的時(shí)候可以省略左邊的引號(hào)雷逆,會(huì)自動(dòng)被引起。同時(shí)污尉,在使用哈希額鍵膀哲,如果花括號(hào)內(nèi)只有裸字,兩邊的引號(hào)也可以省略被碗。(無(wú)需引號(hào)的字符序列某宪,我們稱之為裸字bareword,因?yàn)樗枪铝⒋嬖诘模?br> 當(dāng)然注意,$hash{bar.foo}=1; #構(gòu)成的鍵名是'barfoo'
my @k =keys \$hash;
my @v=values \$hash;
因?yàn)楣>拖褚粋€(gè)大酒桶兴喂,所以里面的順序是無(wú)法預(yù)測(cè)的,但是返回的鍵列表和值列表的順序還是一致的焚志。
my $count =keys %hash; #得到鍵值對(duì)數(shù)
while((\$key,$value)=each %hash){
print "\$key =>$value\n";
}
delete \$books{\$person}; #撤銷person的
%ENV 環(huán)境變量
修改環(huán)境變量
Bourne shell
$CHARACTER=Fred; export CHARACTER
$export CHARACTER=Fred
csh
$ setenv CHARACTER FRED
DOS或者Windows命令
c:>set CHARACTER=Fred
例1:根據(jù)姓來找名字(很有意思的)衣迷,程序名family_name
#! /usr/bin/perl
use warnings;
use strict;
my $s;
my %mily_name=("fred"=>'flintstone',
"barney"=>'rubble',
"wilma"=>'flintstone',
);
print "please enter the family name:\n";
$s=<>;
chomp $s;
print "The ${s}'s name is $family_name{$s}.\n"
例2:程序名為frequence,統(tǒng)計(jì)每行一個(gè)詞匯,這個(gè)詞匯出現(xiàn)的次數(shù)酱酬。
#! /usr/bin/perl
use strict;
use warnings;
my ($string,@string,%string);
@string=<>;
chomp @string;
foreach $string (@string){
$string{$string}+=1;
}
foreach $string (sort keys %string){
print"$string has show up $string{$string} times.\n";
}
例3:程序名為ENV壶谒,讀取%ENV中的鍵值對(duì),排序膳沽,分兩列打印汗菜,縱向?qū)ζ洹?/p>
#! /usr/bin/perl
use warnings;
use strict;
my $longest;
my $key;
my $length;
foreach $key (sort keys %ENV){
my $length=length($key);
if ($length>=$longest){
$longest=$length;
}
}
foreach $key (sort keys %ENV){
printf "%-${longest}s %s\n","$key","$ENV{$key}";
}
注:my操作符只能申明獨(dú)立的標(biāo)量,不能用來申明數(shù)組或哈希里的元素挑社。
use strict起作用時(shí)候才需要申明變量陨界,默認(rèn)情況下并不需要申明標(biāo)量。
8.perl--漫游正則表達(dá)式
正則表達(dá)式(regular expre ssion)是perl內(nèi)嵌痛阻,自成一體的微型編程語(yǔ)言菌瘪。出現(xiàn)在很多語(yǔ)言中,以及在大多數(shù)的程序員文本編輯器中(比如vi和emacs).在perl里通常叫做模式(pattern),用來表示匹配或不匹配某個(gè)字符段的特征模板录平。只要用一個(gè)模式就可以將它們干凈利落地分成兩組:匹配或者不匹配麻车。
在Unix的grep命令中缀皱,它會(huì)檢查哪幾行文本匹配到指定的模式斗这,然后輸出那幾行。
例如: $grep 'flint.stone' chapter.txt
如果模式匹配的對(duì)象是$_的內(nèi)容啤斗,只要模式寫在一對(duì)斜線(/)中就可以了,自動(dòng)去尋找
例如:
\$_="yabba dabba doo"'
if (/abba/){
print;
}
Unicode屬性
他們不只是簡(jiǎn)單的字節(jié)序列。每個(gè)字符出來字節(jié)組合之外牙寞,還有屬性信息。若要匹配某項(xiàng)屬性彼水,只需要把屬性名放入\p{PROPERTY}\里面。比如許多字符屬于空白符极舔,相應(yīng)的屬性名為space,所以要匹配帶有這類屬性的字符凤覆,可以用\p{Space}.將小寫的p改為大寫的P,就表示否定的意義,匹配指定屬性之外的字符拆魏。
. 能匹配任意一個(gè)字符的通配符(不能匹配換行符\n)盯桦,如果要表示點(diǎn)號(hào)本身的話,就需要在前面加上反斜線轉(zhuǎn)義渤刃。同時(shí)拥峦,如要匹配真正的\,也需要在前面加上\卖子。
* 用來匹配前面的條目零次或多次的略号。
+ 匹配前一個(gè)條目一次以上。
洋闽? 表示前一個(gè)條目是可有可無(wú)的
() 對(duì)字符串來分組
我們可以用反向引用來引用圓括號(hào)中的模式所匹配的文字玄柠,這個(gè)行為我們成為捕獲組。
(.)\1 表示匹配連續(xù)出現(xiàn)的兩個(gè)同樣的字符诫舅。\后面的數(shù)字是編號(hào)随闪,只要一次點(diǎn)算左括號(hào)的序號(hào)就可以了
$_="yabba dabba doo";
if (/y((.)(.)\3\2)d\1/){
print;
}
有的時(shí)候?yàn)榱讼聪蛞媚J降闹苯恿坎糠值亩x性
use 5.010; #這個(gè)版本開始才有這個(gè)功能
$_="aa11bb";
if (/(.)\g{1}11/){
print;
}
這里面的g{1}就相當(dāng)于\1,主要是為了避免歧義嘛骚勘,同時(shí)铐伴,也可以用負(fù)數(shù),相反的意思俏讹。
| 通常讀成“或”当宴,要么匹配左邊的內(nèi)容,要么匹配右邊的內(nèi)容泽疆。
[] 表示里面的字符集中任何一個(gè)户矢,比如[a-z],其中-是連字符,表示從a到z
^ 表示除什么之外殉疼,[^a-z]除a到z之外的任意的字符都能匹配
字符的簡(jiǎn)寫
表示任意一個(gè)數(shù)字的字符集的簡(jiǎn)寫是\d
\s 匹配任意空白符
\w現(xiàn)在被擴(kuò)展了梯浪,表示單詞嘛
[\d\D] 表示任何數(shù)字或非數(shù)字,就是說能匹配到任意的字符瓢娜。它跟.相比的話挂洛,這個(gè)同時(shí)還包括換行符。
例1:檢驗(yàn)已知文件中是否含有fred或者Fred字符眠砾,有的話就把這一行打印出來虏劲。
#! /usr/bin/perl
use warnings;
use strict;
while(<>){
if(/(f|F)red/){
print ;
}
}
例2:找包含.的字符串,打印出來那一行。這里面相當(dāng)用了一個(gè)轉(zhuǎn)義符
#! /usr/bin/perl
use warnings;
use strict;
while(<>){
if(/\./){
print ;
}
}
例3:打印那些有兩個(gè)相連且相同的非空字符的行柒巫。
#! /usr/bin/perl
use warnings;
use strict;
while(<>){
if(/(\S)\1/){
print ;
}
}
例4:打印出同時(shí)出現(xiàn)wilma以及fred的行(注意先后之別)
#! /usr/bin/perl
use warnings;
use strict;
while(<>){
if (/wilma.*fred|fred.*wilma/){
print;
}
}
9.Perl--用正則表達(dá)式進(jìn)行匹配
之前我們看到励堡,正則表示的寫法的時(shí)候用的是//,比如說/fred/堡掏,實(shí)際上這是m//的簡(jiǎn)寫应结,就像前面提到的數(shù)組qw//一樣。同樣的泉唁,m也可以任何成對(duì)或不成對(duì)的定界符摊趾,比如說m(fred).
我們可以選擇模式中不會(huì)出現(xiàn)的字符來作為定界符,比如/http:///游两,可以寫為m%http://%砾层。
常見的修飾符
/i 實(shí)現(xiàn)大小寫無(wú)關(guān)的匹配
/s 匹配任意字符 因?yàn)?不能匹配換行符,而加上這個(gè)后贱案,點(diǎn)號(hào)就能匹配任意的字符了
/x 容許在模式里隨意地加入空字符
/a 選擇ASCII碼作為解釋方式
/p 只會(huì)針對(duì)特定的正則表達(dá)式開啟類似自動(dòng)捕獲變量
/g 全局替換
寫法: if (/yes/i)
注意:#是注釋符號(hào)肛炮,如果需要用的話,可以加上\宝踪,或者[#]侨糟。
這些修飾符可以放在一起,放在模式末尾瘩燥,不必在意先后順序秕重。
Perl從5.14開始,有三種字符解釋方式厉膀,ASCII,Unicode,locale溶耘。下面的修飾符分別告訴采取何種方式解釋字符。
use5.014
/\w+/a #僅僅表示A-Z,a-z,0-9
/\w+/u #任何Unicode當(dāng)中定義為單詞的字符
/\w+/l #類似ASCII的版本服鹅,但單詞字符的定義取決于本地化定義
單個(gè)/a修飾符表示按照ASCII方式解釋簡(jiǎn)寫意義凳兵,如果使用兩個(gè)/a,則進(jìn)一步表示僅僅采用ASCII當(dāng)時(shí)的大小寫映射處理
/k/aai #只匹配ASCII字符K或k,但不匹配開爾文符號(hào)
錨位
通過給定錨位,我們可以讓模式僅在指定位置匹配
\A錨位匹配字符串的絕對(duì)開頭
\z錨位字符串的絕對(duì)末尾
\Z錨位字符串絕對(duì)末尾企软,但容許出現(xiàn)換行符
\b是單詞的邊界錨位庐扫,它能匹配任何的那次的首位
\B 非單詞邊界錨位,它能匹配所有\(zhòng)b不能匹配的位置仗哨。
^ 表示行首形庭, /m 分別表示錨位與多行的行首和行尾
=~綁定操作符
默認(rèn)情況下模式匹配的操作對(duì)象是_
例如: if ($some_other=~/\brub/){
經(jīng)典的例子:
#! /usr/bin/perl -w
my $what="larry";
while(<>){
if(/\A($what)/){
print "We saw $waht in the beginning of $_";
}
}
這個(gè)例子中我比較喜歡$_桩卵,這個(gè)代表了輸入行验靡,自動(dòng)被存入的。同時(shí)還有變量的內(nèi)插雏节,當(dāng)然胜嗓,如果加上=^就更牛逼了
捕獲變量
變量$4的意思是模式中第4對(duì)括號(hào)所匹配的字符串內(nèi)容,這個(gè)內(nèi)容和模式運(yùn)行期間反向引用\4所表示的內(nèi)容是一樣的钩乍。但他們并非同一個(gè)事物的兩種名稱:\4反向引用是模式匹配期間得到的結(jié)果辞州,而$4則是匹配結(jié)束后所捕獲的內(nèi)容的索引。
if (/\s(a-zA-Z)+,/){ #捕獲的是空白符和逗號(hào)之間的單詞
print $1;} #$1為捕獲的第一個(gè)變量
這些捕獲的變量通常存活在下次匹配成功為止寥粹。如果需要在數(shù)行之外使用捕獲變量变过,通常最好的做法就是將它復(fù)制到某個(gè)普通變量里。
if (/\s(a-zA-Z)+,/){
my $wilma= $1;
不捕獲變量
有的時(shí)候涝涤,圓括號(hào)的加入僅僅是為了分組媚狰,所以要關(guān)閉它的捕獲功能,只需要在左括號(hào)的后面加上阔拳?:來告訴perl這一對(duì)圓括號(hào)完全是為了分組而存在的崭孤,把變量名留出來
例如: if (/(?:bronoto)?saurus(stedk|burger)/){ #這個(gè)里面$1為(stedk|burger)
命名捕獲
use 5.010
my $names='Fred or Barney';
if ($names=^m/(?\w+)(?:and|or)(?\w+)/){
say "T sam $+{name1} and $+{name2}";
}
看明白了嗎,通過(?PATTERN)糊肠,其中LABERL可以自行命名辨宠,再通過$+{LABEL}來捕獲它
在使用捕獲標(biāo)簽后,反向引用的用法也隨之改變货裹,之前我們用\1或者\(yùn)g{1}這樣的寫法嗤形,現(xiàn)在我們可以使用
\g{label}的寫法
自動(dòng)捕獲變量
$& 字符串實(shí)際匹配模式部分會(huì)被自動(dòng)存在
$` 匹配區(qū)段之前的的內(nèi)容存在
$' 匹配區(qū)段之后的內(nèi)容存在
但是呢,一旦用了這些自動(dòng)捕獲變量弧圆,其他正則表達(dá)式的運(yùn)行速度就會(huì)變慢赋兵。
我們可以將這個(gè)的命名改一下,一下的是在5.10或以上的版本中使用
$& ${^MATCH}來表示
$` ${^PREMATCH}
$' ${^POSTMATCH}
例如:
use 5.010;
if ("Hello,there,neighbor"=^/\s(\w+),/p){
print "That actually matched '${^MATCH}'.\n"
}
之前看到的三個(gè)量詞:* + ?
如果這三個(gè)量詞都不符合要求搔预,我們還可以使用花括號(hào){}形式指定具體的重復(fù)次數(shù)范圍毡惜。
例如 /a{5,15}/其為5到15次的a
優(yōu)先級(jí)
圓括號(hào)(分組或捕獲) (…)(?:…)(?…)
量詞 a*,a+,a?,a{n,m}
錨位和序列 abc,^,$,\A,\b,\z,\Z
折一豎線 a|b|c
原子 a,[abc],\d,\1,\g{2}
有的時(shí)候加上括號(hào)對(duì)弄清優(yōu)先級(jí)有好處,但是圓括號(hào)的使用同時(shí)也會(huì)有捕獲功能哦
例1:檢測(cè)斯撮,是否能匹配到match
#! /usr/bin/perl
while (<>){
chomp;
if(/(match)/){
print "Matched: |$`<$&>$'|\n";
}else{
print "No match:|$_|\n";
}
}
例2:檢測(cè)以字母a結(jié)尾的單詞经伙,
#! /usr/bin/perl
use warnings;
use strict;
while (<>){
chomp;
if (/a\z/){
print;
}
}
例3:以上面的為例子,將其存儲(chǔ)在$1里
#! /usr/bin/perl
use warnings;
use strict;
while(<>){
chomp;
if (/([\d\D]+a\z)/){
print "\$1 contains $1\n";
}
}
例4:接著上題勿锅,使用命名捕獲
#! /usr/bin/perl
use warnings;
use strict;
while (<>){
chomp;
if (/(?[\d\D]*a\z)/){
print "'word' contains $+{name}\n";
}
}
例5:定位以a結(jié)尾帕膜,但是再將之后的5個(gè)字符捕獲至一個(gè)獨(dú)立的內(nèi)存變量
#! /usr/bin/perl
use warnings;
use strict;
while (<>){
chomp;
if (/(?[\d\D]*a)(?\s[\d\D]{4})/){
print "$+{name1} $+{name2}\n";
}
}
例6:輸出以空白結(jié)尾的行
#! /usr/bin/perl
use warnings;
use strict;
while (<>){
chomp;
if (/([\d\D]*\s\z)/){
print "$1 m\n";
}
}
10.Perl--正則表達(dá)式處理文本
如果m//模式匹配現(xiàn)象成文字處理器的“查找”功能,那么s///替換操作符就是“查找并替換”功能溢十。
2,//; #將結(jié)尾的空白替換為空字符串
也可以這么寫: s/^\s+|\s+$//g; 去除開頭和結(jié)尾的空白符
s///也可以采用不同的定界符张弛,但是如果是有左右之分的話荒典,就必須成對(duì)使用酪劫。比如s{fred}{barney}
同時(shí)我們也可以使用之前提到的修飾符,順序無(wú)限后寺董,比如/i,/x,/s
下面是正則表達(dá)式中的一些常用模式覆糟。
/pattern/ | 結(jié)果 |
---|---|
. | 匹配除換行符以外的所有字符 |
x? | 匹配 0 次或一次 x 字符串 |
x* | 匹配 0 次或多次 x 字符串,但匹配可能的最少次數(shù) |
x+ | 匹配 1 次或多次 x 字符串遮咖,但匹配可能的最少次數(shù) |
.* | 匹配 0 次或一次的任何字符 |
.+ | 匹配 1 次或多次的任何字符 |
{m} | 匹配剛好是 m 個(gè) 的指定字符串 |
{m,n} | 匹配在 m個(gè) 以上 n個(gè) 以下的指定字符串 |
{m,} | 匹配 m個(gè) 以上 的指定字符串 |
[] | 匹配符合 [] 內(nèi)的字符 |
[^] | 匹配不符合 [] 內(nèi)的字符 |
[0-9] | 匹配所有數(shù)字字符 |
[a-z] | 匹配所有小寫字母字符 |
[^0-9] | 匹配所有非數(shù)字字符 |
[^a-z] | 匹配所有非小寫字母字符 |
^ | 匹配字符開頭的字符 |
$ | 匹配字符結(jié)尾的字符 |
\d | 匹配一個(gè)數(shù)字的字符滩字,和 [0-9] 語(yǔ)法一樣 |
\d+ | 匹配多個(gè)數(shù)字字符串,和 [0-9]+ 語(yǔ)法一樣 |
\D | 非數(shù)字御吞,其他同 \d |
\D+ | 非數(shù)字麦箍,其他同 \d+ |
\w | 英文字母或數(shù)字的字符串,和 [a-zA-Z0-9] 語(yǔ)法一樣 |
\w+ | 和 [a-zA-Z0-9]+ 語(yǔ)法一樣 |
\W | 非英文字母或數(shù)字的字符串陶珠,和 [^a-zA-Z0-9] 語(yǔ)法一樣 |
\W+ | 和 [^a-zA-Z0-9]+ 語(yǔ)法一樣 |
\s | 空格挟裂,和 [\n\t\r\f] 語(yǔ)法一樣 |
\s+ | 和 [\n\t\r\f]+ 一樣 |
\S | 非空格,和 [^\n\t\r\f] 語(yǔ)法一樣 |
\S+ | 和 [^\n\t\r\f]+ 語(yǔ)法一樣 |
\b | 匹配以英文字母,數(shù)字為邊界的字符串 |
\B | 匹配不以英文字母,數(shù)值為邊界的字符串 |
a|b|c | 匹配符合a字符 或是b字符 或是c字符的字符串 |
abc | 匹配含有 abc 的字符串 |
(pattern) | () 這個(gè)符號(hào)會(huì)記住所找尋到的字符串揍诽,是一個(gè)很實(shí)用的語(yǔ)法话瞧。第一個(gè) () 內(nèi)所找到的字符串變成 2 這個(gè)變量或是 \2 變量寝姿,以此類推下去交排。 |
/pattern/i | i 這個(gè)參數(shù)表示忽略英文大小寫,也就是在匹配字符串的時(shí)候饵筑,不考慮英文的大小寫問題埃篓。 |
\ | 如果要在 pattern 模式中找尋一個(gè)特殊字符,如 "*"根资,則要在這個(gè)字符前加上 \ 符號(hào)架专,這樣才會(huì)讓特殊字符失效 |
下面給出一些例子:
范例 | 說明 |
---|---|
/perl/ | 找到含有 perl 的字符串 |
/^perl/ | 找到開頭是 perl 的字符串 |
/perl$/ | 找到結(jié)尾是 perl 的字符串 |
/c|g|i/ | 找到含有 c 或 g 或 i 的字符串 |
/cg{2,4}i/ | 找到 c 后面跟著 2個(gè)到 4個(gè) g ,再跟著 i 的字符串 |
/cg{2,}i/ | 找到 c 后面跟著 2個(gè)以上 g 玄帕,再跟著 i 的字符串 |
/cg{2}i/ | 找到 c 后面跟著 2個(gè) g部脚,再跟著 i 的字符串 |
/cg*i/ | 找到 c 后面跟著 0個(gè)或多個(gè) g ,再跟著 i 的字符串裤纹,如同/cg{0,1}i/ |
/cg+i/ | 找到 c 后面跟著一個(gè)以上 g委刘,再跟著 i 的字符串,如同/cg{1,}i/ |
/cg?i/ | 找到 c 后面跟著 0個(gè)或是 1個(gè) g 鹰椒,再跟著 i 的字符串锡移,如同/cg{0,1}i/ |
/c.i/ | 找到 c 后面跟著一個(gè)任意字符,再跟著 i 的字符串 |
/c..i/ | 找到 c 后面跟著二個(gè)任意字符漆际,再跟著 i 的字符串 |
/[cgi]/ | 找到符合有這三個(gè)字符任意一個(gè)的字符串 |
/[^cgi]/ | 找到?jīng)]有這三個(gè)字符中任意一個(gè)的字符串 |
/\d/ | 找尋符合數(shù)字的字符淆珊,可以使用/\d+/來表示一個(gè)或是多個(gè)數(shù)字組成的字符串 |
/\D/ | 找尋符合不是數(shù)字的字符,可以使用/\D+/來表示一個(gè)或是更多個(gè)非數(shù)字組成的字符串 |
/*/ | 找尋符合 * 這個(gè)字符奸汇,因?yàn)?* 在常規(guī)表達(dá)式中有它的特殊意思施符,所以要在這個(gè)特殊符號(hào)前加上 \ 符號(hào)往声,這樣才會(huì)讓這個(gè)特殊字符失效 |
/abc/i | 找尋符合 abc 的字符串而且不考慮這些字符串的大小寫 |
無(wú)損替換
(my original)=^s/\d+ribs?/10 ribs/;
也可以在修飾符r的作用下這么使用
use 5014;
my original=^s/\d+ribs?/10 ribs/r;
大小寫的轉(zhuǎn)換:
\U 將其后的所有字符轉(zhuǎn)換成大寫
\L 將后面的所有字符轉(zhuǎn)換成小寫
\E 關(guān)閉大小寫的功能
\l \u 小寫的形式僅僅影響后面跟的第一個(gè)字符
\u\L 表示首字母大寫,后面的字符全部小寫戳吝,順序無(wú)先后
例子: s/(\w+) with (\w+)/\U1/i; 這個(gè)例子中僅僅對(duì)$2大寫浩销,其后的不變。
split操作符
根據(jù)模式來拆分字符串骨坑;
my @fields =split /separator/,_;
join函數(shù)
它的功能和split相反肩刃,它可以把這些片段連接成一個(gè)字符串
my glue,@pieces;
例如 my x為“4:6:8:10:12”
在列表上下文中使用模式匹配操作符(m//)時(shí)祟霍,如果匹配成功,那么返回的是所有捕獲變量的列表盈包;如果匹配失敗沸呐,則返回的是空列表
my $data ="Barney Rubble Fred Flintstone Wilma Flintstone"
my @words=($data=~/(\w+)\s+(\w+)/g);
my $words=($data=~/(\w+)\s+(\w+)/g);
你看 ,這樣就可以將標(biāo)量變成數(shù)組或哈希了呢燥。
I thought you said Fred and Velma,notWilma
可以這樣來 s#(.*?)#$1#g; 如果不加問號(hào)的話崭添,就只有一個(gè)結(jié)果,加了以后才能有兩個(gè)
把整個(gè)文件讀進(jìn)一個(gè)變量叛氨,然后把文件名作為每一行的前綴呼渣。
open FILE,$filename
or die "Can't open '$filename':$!";
my $lines=join '',;
$LINES=~s/^/$filename:/gm;
從命令行直接編輯
在終端中輸入 :$perl -p -i.bak -w -e 's/RANDALL/RANDAL/g' fred*.dat
這個(gè)就相當(dāng)于:
#! /usr/bin/perl -w
$^I=".bak";
while(<>){
s/RANDALL/RANDAL/g;
print;
}
-p讓perl自動(dòng)生成一段小程序寞埠, -i相當(dāng)于$^I設(shè)為.bak屁置,如果不想備份文件的話,可以直接寫-i仁连;-w警告功能蓝角;-e后面跟著的是可執(zhí)行的程序代碼
例1:匹配3個(gè)$what
#! /usr/bin/perl
use warnings;
use strict;
my $what='fred|barney';
while (<>){
chomp;
if (/($what){3}/){
print "$_\n";
}
}
例2:將Fred換成Larry,同時(shí)輸出文件名為*.out
#! /usr/bin/perl
use warnings;
use strict;
while(<>){
chomp;
s/Fred/Larry/ig;
print "$_\n";
}
根據(jù)上面的程序即可,同時(shí)在使用的時(shí)候 : perl 程序名 <文件名> 生成的文件名.out
當(dāng)然也可以指定輸出饭冬,但是我覺得太麻煩了帅容,就算了吧
例3:將Fred和Barney互換
#! /usr/bin/perl
use warnings;
use strict;
while(<>){
chomp;
s/Fred/Larry/ig;
s/barney/Fred/ig;
s/Larry/Barney/ig;
print "$_\n";
}
例4:在開始前加文本申明:
#! /usr/bin/perl
use warnings;
use strict;
$^I=".bak";
while(<>){
s/\A\#/## Copyright (C) 2013 by Sam \n\#/;
print;
}
歡迎關(guān)注oddxix
有趣的靈魂等著你~
如果覺得寫的不錯(cuò)記得點(diǎn)個(gè)贊哦~