日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Learning Perl 2

發布時間:2023/11/29 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Learning Perl 2 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.子程序

?

1).創建子程序:使用關鍵字sub

sub marine {

print "Hello, world\n";

}

? ? calling subroutines,使用&號

&marine

(2).返回值:所有的子程序最后一個表達式的運算結果都當作返回值。所以子程序只有“”有用返回值“和無用返回值之分。所以讓一個類似print的函數的結果來充當返回值十分糟糕。比較合適的是最后一行有個if分支。

(3).參數

調用的時候加上列表表達式就行。例如&max(10, 15)。多余的變量都會被忽略,超過數組@_邊界的變量將會是undef。

Perl在子程序中用@_數組存儲參數。第一個參數是$_[0],第二哥存儲在$_[1]...

注意:這些變量僅是數組@_的一部分,與標量$_無關。這和任意變量$arr與@arr,$arr[0]無關的道理一樣。

sub max {

if($_[0] > $_[1]) {

$_[0];

} else {

$_[1];

}

}

@_是子程序的私有變量,如果有了一個全局變量@_,調用前會先被存起來,并在子程序返回時恢復原本的值。

?

?

(4).Perl子程序的參數的傳遞是按引用傳。

#!/usr/bin/perl -w sub marine{ $_[0]="sub1"; $_[1]="sub2"; } $m="out1"; $n="out2"; print marine($m,$n)."\n"; print "$m\n$n"; 則會輸出 sub2 sub1 sub2 (5).由于perl的子程序參數是可變長度的參數列表,可以用if來檢查 if(@_ != 2) { print "WARNING, this subroutine should get exactly two parameters!\n" } 塊的最后一條語句可以省略;號。無論在控制結構的塊還是在子程序的塊中。 (6).return $_;立即返回某個值。 (7).何時可以省略調用子程序時的&:當定義在調用之前,或者用()來傳遞參數時就可以省略& (8).返回非標量值,最后一行為列表即可 sub marine{ #... reverse 1..10; } (9).采用高水位標記算法來處理任意數量參數的max print &max(3,5,6,1,2,12); #或者直接傳入一個列表 #@numbers=(3,5,6,1,2,12); #print &max(@numbers); sub max { my($max_so_far)=shift @_; foreach (@_) { if($_ > $max_so_far) { $max_so_far=$_ } } $max_so_far } 2.perl范圍聲明 our,"把名字限于某個范圍“,其實就是明確聲明一個"全局變量",雖然是在某個模塊或者函數里面定義的,外面的也可以訪問,如果已經聲明過了,再次用"our",表示此處用的是全局的那個,不是同名的私有或者局部變量 our $PROGRAM_NAME = "waiter"; { my ?$PROGRAM_NAME = "something"; our $PROGRAM_NAME = "server"; #這里的our和外面的相同,和前句不同。 # 這里調用的代碼看到的是"server" } # 這里執行的代碼看到的仍然是"server". my ,"把名字和值都限于限于某個范圍",簡單說,就是只能本層模塊或者函數可以看到這個變量,高一層的或者低一層的都看不到的。 sub greeting1{ my ($hello) = "How are you do?"; greeting2(); }? sub greeting2{ print "$hello\n"; } $hello = "How are you doing?"; greeting2(); greeting1(); greeting2(); 運行結果: How are you doing? How are you doing? How are you doing? -------------------------- 一個 How are you do? 都沒有,在greeting1中call greeting2時,greeting2看不到greeting1的私有 $hello變量,只能看到外面的全局變量$hello local,"把值局限于某個范圍",也有叫"動態詞法范圍",有點不好懂。我的理解,就是本層和本層下層的函數可以看到本層的變量,但是本層上一層的不可以。到底范圍是多少,不僅取決于本層的函數,還要看下一層的程序長度和深度,所以叫"動態范圍"。 sub greeting1{ local ($hello) = "How are you do?"; greeting2(); } sub greeting2{ print "$hello\n"; } $hello = "How are you doing?"; greeting2(); greeting1(); greeting2(); 運行結果: How are you doing? How are you do? How are you doing? ----------------------- 跟用 my 時不一樣了吧? 此時在greeting1調用greeting2時,greeting2可以看到greeting1的局部變量$hello,外部的全局變量當然就隱藏了。 范圍操作符不會改變變量賦值時的上下文。 例如 my($num)=@_; #列表上下文,等同于($num)=@_,$num是第一個元素的值 my $num=@_; #標量上下文,等同于$num=@_,$num是列表的長度 3. 使用use strict;強制使用一些良好的程序規范,例如不能操作未初始化的變量。可以有效防止變量名打錯的情況。 4. 鉆石操作符 鉆石操作符<>是perl的讀取文件(文件名通過參數傳入,即@ARGV數組。如果@ARGV為空,則改用標準輸入流)每一行的操作符,讓perl程序也能像cat,sed等應用程序直接處理文本文件。是一個整行輸入操作符的特例。 #!/usr/bin/perl -w while (defined ($line=<>)){ chomp ($line); print "$line\n"; } 或者簡寫成 while (<>) { chomp; print "$_\n"; } print <> ; ? cat 的perl實現, print sort <> ; sort的perl實現 <>的另一個例子,通過打開的文件描述符 open(HANDLE,"c:/test.txt") ? or ? die ? "文件不能打開"; ? ? while ? (<HANDLE>) ? ? ? ? ? ? #注:這就是對文件句柄讀取一行并存入變量 ? $_ ?? { ?? print; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #注:打印變量 ? $_ ?? } 5.輸出至標準輸出 print 注意:print (2+3)*4;會打印5,然后print的返回值1(成功)會被乘以4. 小心這種帶括號的操作符用法。 printf和C語言的printf類似,%g是輸出恰當的數值形式。自動輸出整數,浮點數和指數形式。例如5/2, 51**17會輸出2.5,1.0683e+29 生成格式字符串 my @items=qw(wilma dino pebbles) my $format="The items are:\n".("%10s\n" x @items) #使用x來復制字符串,@items為3,即“%10s\n”三遍 printf $format, @items 6.文件句柄 (1).打開文件句柄 通常文件句柄用大寫標識。 Perl提供3種文件句柄:STDIN STDOUT STDERR由Perl的父進程(可能是Shell)提供。當使用其他的文件句柄時,使用open操作符告訴Perl。 例如: open CONFIG,"dino" open CONFIG,"<dino" #同上即默認行為,表示這個文件是提供輸入數據的。不能創建則返回失敗0 open BEDROCK,">fred" #如果已經有一個文件存在,則清楚原有內容并以新內容取代之 open LOG,">>LogFile" #如果不存在,則創建。如果存在,則追加 檢測文件句柄的有效性 my $success=open LOG,“>>logfile” unless ($success) { #open失敗 } 比如可以直接使用die中止運行或者warning送出警告信息。perl程序的exit status:0成功,1語法錯誤,2處理某程序發生錯誤,3可能找不到某個細節配置文件等 if(!open LOG, ">>logfile") { warning "can not create file" } if(@ARGV < 2) die "Not enough arguments.\n" 另:open CONFIG, "logfile" or die "not such file"; 關閉文件描述符: close LOG (2).使用文件句柄 print LOG “...”; printf STDERR "..."; open PASSWD, "/etc/passwd" or die "cannot open passwd file" while (<PASSWD>) { chomp; ...... } 或者放到列表里 open PASSWD, '</etc/passwd'; @lines = <PASSWD>; $line=shift @lines; #print $line,"\n"; foreach $temp (@lines) { print $temp; } (3).用select改變默認的輸出文件句柄 select LOG; print “<INFO>, ....”; #就會輸出到文件句柄LOG中而不是STDOUT select STDOUT; 默認的情況,寫出的文件都會經過緩沖處理。只要將變量$|設置為1,就會在每次輸出操作后,立即清除緩沖區(flush) (4).重新打開標準文件句柄 open STDERR, “>>/home/luffy/.error.log” #die和warn的信息會輸送到STDERR中(默認是屏幕) 7.散列 (1).哈希是一種數據結構,類似數組。但是不像數組以數字下標進行檢索,而是以檢索的鍵(即唯一的字符串標識)進行檢索。哈希相當于一些鍵/值隊的集合,沒有順序。 鍵一定要是字符串,如果以50/20為鍵,則會被轉換為一個含有三個字符的字符串”2.5”. 哈希沒有大小上限,可以是任意大小。 相對于其他腳本語言的哈希(如awk),Perl的哈希不會因為變大而產生性能問題。 哈希的值可以是數字,字符串,undef或者這些類型的組合。 哈希中的元素,賦值時會自動增加。 當鍵的字符串嚴格符合變量定義要求,或者定義時使用=>來定義。就可以免去鍵的引號。例如$family_name{fred}; 例如: $family_name{“fred”}=”flintstone”; foreach $person (qw <barney fred>) { print “I‘ve heard of person $person $family_name{$person}” } (2).引用整個哈希,用%號 %myhash=("abc",1,"bcd",2,"cde",3); #以鍵,值,鍵,值,鍵,值存儲為hash %myhash=(%myhash,"def",4); %myhash=( "abc"=>1, "bcd"=>2, "cde"=>3 ); @myarr=%myhash; #展開為列表 %new_hash=%myhash; #哈希的賦值,注意這一行代碼會讓%myhash展開為列表,然后再復制給%new_hash %new_hash=reverse %myhash; #同上,先展開為列表再做reverse運算。注意reverse操作不僅會使位置倒置,而且會使鍵/值互換 #這里注意一點:由于hash中不能有重復的鍵。如果展開的列表后面有重復的鍵,它的值會覆蓋掉前面的! (3). 散列函數 my $k = keys %myhash; my $v = values %myhash; if (%hash) { #直接作為bool判斷 print “exists one kv pair”; } 對散列進行迭代,可以使用each函數獲得下一組kv隊,直到所有元素被訪問到。例如 while(($key,$value)=each %myhash) { #each會返回包含一組鍵值對的列表,直到each返回空列表,$key和$value都會是undef print "$key=>$value"."\n"; } if(exists $books{"Thinking in Java"}) #exists函數! print "the book exists"; delete $book{"thinking in Java"} #delete函數! } 哈希元素的內插,需要用循環來以此輸出。不支持整個哈希列表的內插 my %hash = ("a"=>1, "b"=>2, "c"=>3, "d"=>4); foreach $key (sort keys %hash) { print "$key => $hash{$key}\n"; } 參考:perl范圍聲明our,my,local ? ? ?http://blogold.chinaunix.net/u1/51156/showart_441696.html Textbook:learning perl

?

轉載于:https://blog.51cto.com/aboocool/586595

總結

以上是生活随笔為你收集整理的Learning Perl 2的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。