1:perl與C語言的不同:
A:整數與浮點數均被看作雙精度浮點數。
B:對於長的整數,perl用下劃線來分隔,如:123456,可以表示爲
123_456。
C:perl中NULL沒有特殊的含義,不能靠null來判斷字符串是否結束。
D:perl變量,數組使用前無須聲明,但函數使用前需要聲明。
E:空的控制語句如if,不能省略{ },而c語言可以。
F:perl無Boolean類型,真假原則如下:
如值爲數字,0爲false,其餘爲真。
如值爲字符串,則空串(‘’)爲false,其餘爲真。
特殊之處:perl將0與‘0’相同對待。
G:交換變量的值:
($fred,$barney) = ($barney,$fred),而C語言需要臨時變量。
H:數組直接拷貝:
@copy = @quarry;#將一個數組中的值拷貝到另一個數值中。
2:單引號雙引號區別:
單引號字符串中的/n不會被當作換行符來處理,其僅僅是兩個字符/和n。只有在反斜線/後面接的是/或單引號’時,其纔會被當作特殊字符使用。
串聯操作符:.
字符串重複操作符(string repetition operator):由小寫的字母x表示,把操作符左邊的字符串重複操作符右邊數字那麼多次數。
3:perl warnings
可以在命令行用-w參數打開警告:
$perl –w my_program
打開警告提醒的方法:
UNIX:#! /usr/bin/perl –w
WINDOWS:#! Perl –w
獲得更多的診斷信息:
#! /usr/bin/pelr
use diagnostics; #diagnostics(診斷)
4:字符串變量知識:
當一個字符串由雙引號括起來時,如果變量前面沒有反斜線,其變量值將被內插,即字符串中的變量被其值代替。
其中:單獨一個變量,引號沒有意義。
Print “$fred”;等價於print $fred;
5:字符串的比較運算符
相等: eq
不等: ne
小於: lt
大於: gt
小於或等於:le
大於或等於:ge
6: chomp操作:
功能:去掉字符串結尾的換行符。
舉例:chomp(#text =<STDIN>);#讀入,但不含換行符
注:如結尾有兩個或兩個以上的換行符,chomp僅去掉一個。
7:Pop與Push操作:對數組的末尾進行操作。
pop操作將數組的最後一個元素取出並返回。
Push操作將一個元素或一列元素加在數組的結尾。
形式如下:pop(數組變量);push(數組變量,添加的元素)
舉例:@array = 5..9;
$fred = pop(@array);#$fred得到9,@array爲(5,6,7,8)
push(@array,0);#@array變爲(5,6,7,8,0)
與pop/push相似,shif/unshift操作符對一個數組的開頭進行操作。
8:標量與列表上下文(重點)
上下文:即表達式存在的地方。
標量與列表的區別:
舉例: $fred = something; #標量context
@pebbles = something; #列表context
($Wilma,$sjej) = something; #列表context
($fred) = something; #列表context (注意與第一個區別)
如在reverse,在列表context中,返回反轉的列表;在標量context中,返回反轉的字符串
函數scalar:強制將列表context轉換爲標量context。
9:定義子程序(subroutine):使用關鍵字sub,子程序的名字(無&這個符號)
sub marine
{
$n+=1;
print “Hello,sailor numners $n!/n”;
}
子程序調用的規則:計算每一步的值,返回子程序中最後計算的值。
且子程序的定義是全局的。
子程序的調用方法:&marine;(*)
10:最大值程序:
$maximum = &max(3,5,10,4,6);
sub max
{
my($max_so_far) = shift @_; //從參數數組@_中取出
foreach (@_) //foreach循環遍歷@_剩下的值
{
if($_>max_so_far) //循環中默認控制變量爲$_,第一次循環$_爲5
{
$max_so_far = $_;
}
}
$max_so_far;
}
創建私有變量的方法:my,如:my($m,$n);
my操作不會改變賦值殘暑的context.
注:use strict; #迫使程序採取嚴格的檢測
11:<>輸入操作符:程序如下,
while(<>)
{
chomp;
print “It was $_ that I saw!/n”;
}
其中,chomp使用了默認參數,沒有變量時,chomp將對$_操作。
<>通常被用來處理所有的輸入。
12:區別程序:
打印數組與內插一個數組是不同的。
@array = qw /fred barney betty/;
print @array; #打印出元素的列表
print “@array”; #打印一個字符串(包含一個內插的數組)
第一個輸出:fredbarneybetty
第二個輸出:fred barney betty(由空格分開)
13:當print調用的方法看起來是函數調用,它就是函數調用。
Print原則:
當print後面無括號時,print是一列表調用。
當print後面有括號時,print爲函數調用,輸出括號中的內容。
如:print (2+3)*4;
表示:輸出5,將print的返回值1乘以4,結果被丟棄。
14:數組與printf:
my @items = qw( Wilma dino pebbles);
my $format = “The items are:/n”.(“%10s/n”x@items);
printf $format,@items;
等價於:
printf “The items are:/n”.(“%10s/n”x @items),@items;
其中,@items使用了兩次,一次在標量context中,取其元素的個數;一次在列表context中取元素。
注:x操作符:確定字符串要重複的次數。
15:文件句柄(filehandle):是程序I/O連接的名字,不是文件的名字。
Perl自帶了六個文件句柄:STDIN,STDOUT,STDERR,DATA,ARGV,ARGVOUT
文件句柄的打開:
open CONFIG,”dino”
打開名爲CONFIG的文件句柄,指向dino文件。默認是輸入。
open CONFIG,”<dino”;
功能同上,<明確指明:使用這個文件進行輸入操作。
open BEDROCK,”>fred”;
打開文件句柄BEDROCK,輸出到新文件fred中。
open LOG,.”>>logfile”;
>>打開一個文件,數據追加到文件後面。
Perl 5.6版本以後支持三參數的文件格式:
Open CONFIG,”<”,”dino”;
Open BEDROCK,”>”,$file_name;
16:關閉文件句柄:
close BEDROCK;
die函數:
die函數創建自己的嚴重錯誤,打印出給定的錯誤信息,die自動將程序的名字和行數輸出在消息的末尾。
If(!open LOG,”>>logfile”)
{
die “Cannot create logfile:$!”;
}
注:其中的$!指系統產生的一些可讀的信息。
Select操作符:改變默認的輸出句柄。
注:關於文件句柄的重新打開,只有perl成功的重新打開新的連接,否則不會關閉以前的連接。
17:哈希(hashes)
哈希元素的提取:
$hash{$some_key}
注:此處下標(key)使用的是花括號{},key的表達式是字符串,而不是數字,且key必須是唯一的。
引用整個hash:使用%號作爲前綴。
Hash的值(在列表context)是一個key/value對的列表。
大箭頭符號:(=>),用於識別key與value
舉例:my %last_name =
{
“fred” => “flintstone”,
“betty” => “rubble”,
}
18:哈希函數:
A:keys與values函數
Keys返回此hash中所有的keys,values函數返回所有的values.
My %hash = (“a”=>1,”b”=>2,”c”=>3);
My @k = keys%hash;
My @v =values%hash;
在標量context中:
my $count = keys%hash;#返回hash中元素的個數。
B:each函數(通常用在while循環中)
While(($key,$value) = each %hash)
{
print “$key =>$value/n”;
}
C:exists函數:查看hash中是否存在某個key
If(exists $books{$dino})
{
print “Hey,there’s a libaray card for dino!/n”;
}
D:delete函數:從hash中刪除某個key
My $person = “betty”;
Delete $books {$person};#將$person的借書卡刪除掉
E:hash元素的內插:用於在雙引號的字符串中使用單個元素。
Foreach $person (sort keys %books)
{
if($books{$person})
{
print “$person has $books{$person} items/n”
}
}
19:正則表達式(regular Expessions):在perl中也稱爲模式(pattern).
注:and與or在正則表達式中不是操作符,僅僅是個單詞。
點(.)通配符:可以匹配任何單個的字符,不包括換行符(“/n”).
*:表示匹配前一字符0次或者多次。
.*:能匹配任何字符串(除了換行符)。
+:可以匹配前面的字符一次或多次。
?:匹配前面的字符一次或0次。
|(豎線):匹配左邊或右邊的。
[]:匹配括號內出現的任意單個字符。
/d:任意數字的類,[0-9]。
/w:稱爲word字符,[A-Za-z0-9],注/w不能匹配單詞,只能匹配單個字符,
word由字母,數字。下劃線組成。
/s:匹配空白(whitespace),等價於:[/f/t/n/r]
20:正則表達式中可選的修飾符:
/i:不區分大小寫
/s:匹配任何字符
/x:添加空格
/b:詞界錨定,針對單詞的。
=~:綁定操作符,告訴perl將右邊的模式在左邊的字符串上進行匹配,而不是對$_匹配。
如:print “Do you like Perl?”;
my $likes_perl = (<STDIN> =~//byes/b/I); #括號可以省去,=~優先級高
…… #Times passes…
if($likes_perl)
{
print “You said earlier that you like Perl,So…/n”;
}
匹配變量:
$_ = “Hello there,neighbor”;
if(//s(/w+),/) #匹配空格和逗號之間的詞
{
print “the world was $1/n”;#the world was there
}
21:perl中提供的三個自動匹配的變量:$&,$`,$’
如:if(”Hello there,neighbor” =~//s(/w+),/)
{
print “That was ($`)($&)($')”;
}
輸出的消息爲:(Hello)(there,)(neighbor).
其中:$&保存整個被匹配的部分,$`保存匹配部分的前一部分。
$'保存匹配部分的後一部分。
22: 正則表達式處理文件
全局替換:
$_ = “home,sweet home!”;
s/home/cave/g;
print “$_/n”; #“cave,sweet cave!”;
其他舉例:
s//s+/ /g; #將多個空格用單個空格代替。
s/^/s+//; #將開頭的空白去掉
s//s+$//; #將結尾的空白去掉
s/^/s+|/s+$//g; #去掉開頭結尾的空白
大小寫轉換:
$_ = “I saw Barney with Fred.”;
s/(fred|barney)//U$1/gi; #$_現在是:I saw BARNEY with FRED.
/U:轉換大寫
/L:轉換小寫
/u/L:第一個字符大寫,其他字符均小寫。
23: 加號的非貪婪類型是:+?,星號的非貪婪類型是:*?
貪婪類型是:.+ 貪婪類型是:.*
更新文件:
#! /sur/bin/perl –w
use strict;
chomp (my $data =‘date’);
#獲取系統的當前時間,更好的方法是localtime函數
# my $date = localtime;
$^I = “.bak”;
while(<>)
{
s/^Author:.*/Author:Randal L. Scharwartz/;
s/^Phone:.*/n//;
s/^Date:.*/Date:$date/;
print;
}
24:perl控制語句:
unless:除非條件爲真。
elsif:注意只有一個e
next:結束本次循環,進行下一次循環。
redo:繼續執行本次循環
last:立及結束循環,等同於C語言中的break語句。
Perl實現了C中所有的操作符。
舉例:?:三目運算符,利用?:編寫分支程序小技巧:
my $size =
($width<10)?”small”:
($width<20)?”medium”:
($width<50)?”large”:
“extra_large”; #default
25:文件檢驗
文件檢驗操作:
如:die “Oops! A file called ‘$filename’ already exists./n”
if –e $filename;
# -e選項檢測是否存在相同名字的文件。
其他常見的選項有:
-M:修改的時間
-T:文本文件
-B:二進制文件
-A:訪問的時間
-s:文件或目錄存在,大小大於0(值爲文件的大小,字節)
例:將文件移動備份磁帶
my @original_files = qw/ fred barney betty Wilma pebbles dino
bam-bamm/;
my @big_old_files;
foreach(@original_files)
{
push @big_old_files,$_
if (-s)>100_100 and –A_>90;#比下面的效率高
#第一次檢測使用了默認的變量$_.
#第二次檢測使用_這個文件句柄。
#if –s $filename >100_100 and –A$filename >90;
}
26:目錄操作:
chdir:改變工作目錄(等價於Unix中的cd)
chdir “/etc” or die “cannot chdir to /etc:$!”;
globbing:將文件名模式轉換成它所匹配的文件名
my @all_files = glob “*”;
#@all_files得到了當前目錄下的所有文件,安字母排序,不包括由點.開頭的文件
等價於Unix中的echo命令
目錄句柄:
打開:Opendir,讀:readdir.關閉:closedir
刪除文件:
unlink,刪除文件(Unix中用rm刪除文件)
unlink glob “*.o”;
#刪除所有文件後綴爲.o的文件,unlink返回值爲成功刪除的文件數。
重命名文件:
rename,(Unix中用mv命令)
rename “old”,”new”;
連接與文件:
link函數。創建一個新的連接。
創建刪除目錄:
mkdir,創建新目錄。
Mkdir “fred”,0755 or warn “cannot make fred directory:$!”;
#0755,表示目錄設置的初始權限。
rmdir:刪除目錄
修改權限:
chmod,與Unix相似
chmod 0755,”fred”,”barney”;
#chmod返回其成功改變的個數。
改變所有者:
chown:改變一批文件的所有者及所在的組。
如:My $user = 1004;
My $group = 100;
Chown &user,$group,glob “*.o”;#兩者同時修改
改變時間戳:
utime函數
my $now = time;
my $ago = $now-24*60*60;
utime $now,$ago,glob “*”;
27:字符串與排序
使用索引尋找字串
$where = index($big,$small);
#返回第一個字符的位置,字符位置從0開始。
rindex:返回字符最後一次出現的位置。
使用substr操作字串
$part = substr($string,$initial_position,$length);
三個參數:一個字符串,一個從0開始編號的初始位置,以及字串的長度。
返回一個子串
my $mineral = substr(“Fred J.Flintstone”,8,5);
#得到”Flint”
my $long =”some very long string”;
my $right = substr($long,index($long,”l”));
#返回字符串中字母l後的子串
繼續舉例:
my $string = “Hello,world!”;
substr($string,0,5) = “Goodbye”;
#$string現在變爲“Goodbye,world!”;
substr($string,-20) =~s/fred/barney/g;
#將字符串最後20個字符串中的fred改爲barney