Perl文件句柄引用
目前還沒介紹Perl的面向?qū)ο?#xff0c;所以這節(jié)內(nèi)容除了幾個注意點,沒什么可講的。
以前經(jīng)常使用大寫字母的句柄方式(即所謂的裸字文件句柄,bareword filehandle),現(xiàn)在可以考慮轉(zhuǎn)向使用變量文件句柄的形式,因為只有使用變量句柄的方式,才能創(chuàng)建文件句柄引用。
open DATA,">>","/tmp/a.log" or die "can't open file: $!"; open my $data_fh ,">>","/tmp/a.log" or die "can't open file: $!"; open my $fh, '<', 'castaways.log' or die "Could not open castaways.log: $!";裸字文件句柄和變量文件句柄用法是完全一致的,能用裸字文件句柄的地方都可以替換為變量文件句柄:
while( <DATA> ) { ... } while( <$log_fh> ) { ... }不管使用裸字還是變量文件句柄的方式,在退出文件句柄所在作用域的時候,都會自動關(guān)閉文件句柄,無需手動close。
只是需要注意的是,使用變量文件句柄的方式,在say/print輸出的時候,指定文件句柄時需要使用大括號包圍,以免產(chǎn)生歧義:
print {$data_fh} "your output content";如果想要讓某個函數(shù)指定輸出的文件句柄,也簡單,只需將文件句柄作為一個參數(shù)即可:
log_message( $log_fh, 'My name is Mr. Ed' ); sub log_message {my $fh = shift;print $fh @_, "\n"; }字符串句柄
除了可以將句柄關(guān)聯(lián)到文件(open)、管道、套接字、目錄(opendir),還可以將句柄關(guān)聯(lián)到字符串。也就是將一個變量作為文件句柄的關(guān)聯(lián)對象,從這個變量讀或從這個變量寫。
例如:
open my $string_fh, '>>', \my $string; open my $string_fh, '<', \$multiline_string;上面第一句聲明了一個詞法變量$string(初始化為Undef),同時創(chuàng)建了一個文件句柄$string_fh,這個文件句柄的輸出對象是詞法變量$string指向的數(shù)據(jù)對象。第二句則是從字符串$multiline_string中讀取數(shù)據(jù)。
現(xiàn)在可以向這個文件句柄中輸出一些數(shù)據(jù),它們會存儲到$string中:
#!/usr/bin/perlopen my $string_fh, ">>",\my $string or die "...$!";print {$string_fh} "first line\n"; print {$string_fh} "second line";print $string,"\n"; # 輸出兩行:first line和second line如果想將流向標準輸出STDOUT默認設(shè)備(終端屏幕)的內(nèi)容改輸出到字符串中,需要小心一些,因為STDOUT畢竟是標準輸出,程序的很多部分可能都需要使用它。所以,盡量在一小片范圍內(nèi)修改標準輸出的目標。例如,使用大括號包圍,并將STDOUT進行l(wèi)ocal化(裸字文件句柄只能用local修飾):
print "1. This goes to the real standard output\n"; my $string; {local *STDOUT;open STDOUT, '>', \ $string;print "2. This goes to the string\n";$some_obj->noisy_method(); # this STDOUT goes to $string too } print "3. This goes to the real standard output\n";文件句柄容器
說法有點高大上,其實就是將文件句柄存儲到數(shù)據(jù)結(jié)構(gòu)中(例如hash、數(shù)組),做一個裝文件句柄的容器。
例如,有一個文件a.txt,內(nèi)容如下。現(xiàn)在想將每一行第二列、第三列存儲到以第一列命名的變量中。
malongshuai big 1250 malongshuai small 910 gaoxiaofang big 1250 gaoxiaofang small 450 tuner middle 1218 wugui middle 199如下:
use v5.10; # for state while( <> ) {state $fhs; # 定義一個hash引用變量my( $source, $destination, $bytes ) = split;unless( $fhs->{$source} ) { # 當hash鍵(第一列)不存在時,創(chuàng)建字符串句柄open my $fh, '>>', $source or die '...';$fhs->{$source} = $fh;}say { $fhs->{$source} } "$destination $bytes"; }總結(jié)
以上是生活随笔為你收集整理的Perl文件句柄引用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python第一周:python初识、流
- 下一篇: 使用ASP.NET Core开发Grap