術(shù)語(yǔ)匯編 全面認(rèn)識(shí)Perl文件句柄
本文和大家重點(diǎn)討論一下Perl文件句柄的概念,Perl腳本通過(guò)Perl文件句柄連接到外部世界。當(dāng)Perl腳本開(kāi)始執(zhí)行時(shí),默認(rèn)地打開(kāi)3個(gè)Perl文件句柄:STDIN,STDOUT和STDERR。
Perl文件句柄
Perl腳本通過(guò)間接Perl文件句柄連接到外部世界。從間接Perl文件句柄讀就導(dǎo)入外部數(shù)據(jù),向間接Perl文件句柄寫(xiě)則導(dǎo)出數(shù)據(jù)。根據(jù)間接Perl文件句柄的創(chuàng)建方式,可能連向:
磁盤(pán)文件。
硬件設(shè)備,例如打印機(jī)等。
本地進(jìn)程,例如窗口系統(tǒng)中的一個(gè)命令行窗口。
遠(yuǎn)程進(jìn)程,例如一個(gè)網(wǎng)絡(luò)服務(wù)器。
"位存儲(chǔ)桶"設(shè)備,也就是Unix/Linux系統(tǒng)中的/dev/null,該設(shè)備僅是吸引數(shù)據(jù)并忽略它。
間接Perl文件句柄可以是任何有效的Perl標(biāo)識(shí)符,由大小寫(xiě)字母、數(shù)字和下劃線字符組成。不同于其他變量的是,間接Perl文件句柄沒(méi)有標(biāo)志性的前綴(像"$","@","%")。因此,為了使間接Perl文件句柄有所區(qū)別,Perl程序員經(jīng)常以全部大寫(xiě)字母表示它們。
當(dāng)Perl腳本開(kāi)始執(zhí)行時(shí),默認(rèn)地打開(kāi)3個(gè)間接Perl文件句柄:STDIN,STDOUT和STDERR。STDOUT間接Perl文件句柄(即"standardoutput")標(biāo)準(zhǔn)輸出,是默認(rèn)的輸出間接Perl文件句柄。發(fā)送給這個(gè)間接Perl文件句柄的數(shù)據(jù)在用戶指定的輸出設(shè)備上顯示,通常是腳本開(kāi)始運(yùn)行的命令行窗口。STDIN(即"standardinput")標(biāo)準(zhǔn)輸入,是默認(rèn)的輸入間接Perl文件句柄。從這個(gè)間接Perl文件句柄讀取的數(shù)據(jù)取自用戶選擇的輸入設(shè)備,通常是鍵盤(pán)。STDERR(即"standarderror")標(biāo)準(zhǔn)錯(cuò)誤輸出,用于錯(cuò)誤信息、診斷、調(diào)試和其他類似的偶發(fā)輸出,默認(rèn)情況下,STDERR和STDOUT使用相同的輸出設(shè)備,但是用戶可以自行改變。
正常輸出和不正常輸出有不同的獨(dú)立間接Perl文件句柄,這樣用戶就能夠獨(dú)立地轉(zhuǎn)移它們;例如,將正常輸出發(fā)送到文件而將錯(cuò)誤輸出發(fā)送到屏幕。
- #!/usr/bin/perl-w
- chomp($input=<>);
- print"IfIheardyoucorrectly,yousaid:$input\n";
STDERR是warn()函數(shù)和die()函數(shù)的默認(rèn)目標(biāo)。用戶在開(kāi)始執(zhí)行腳本之前可以改變?nèi)齻€(gè)標(biāo)準(zhǔn)間接Perl文件句柄的連接。在Unix/Linux和Windows系統(tǒng)上,使用重定向元字符"<"和">"來(lái)完成這種改變。例如,對(duì)一個(gè)名為change.pl的腳本執(zhí)行這兩條重定向命令,將改變?cè)撃_本的標(biāo)準(zhǔn)輸入,使其從文件data.txt中讀取數(shù)據(jù),并改變標(biāo)準(zhǔn)輸出,使處理過(guò)的數(shù)據(jù)輸出到文件changed.txt中:
#perlchange.pl<data.txt>changed.txt
標(biāo)準(zhǔn)錯(cuò)誤不改變,因此診斷信息(例如,從內(nèi)置的warn()函數(shù)和die()函數(shù)返回的信息)在屏幕上顯示。
間接Perl文件句柄
間接間接Perl文件句柄可以使名字空間的管理更簡(jiǎn)單。由于間接Perl文件句柄對(duì)于當(dāng)前包是全局
的,兩個(gè)函數(shù)試圖同時(shí)打開(kāi)"INFILE"會(huì)導(dǎo)致沖突。如果兩個(gè)函數(shù)使用間接文
件句柄比如"my$infile",則不會(huì)發(fā)生沖突,也不用擔(dān)心以后會(huì)發(fā)生沖突。
"open"的***個(gè)參數(shù)可以是一個(gè)間接Perl文件句柄的引用。在Perl5.6.0中,如果
參數(shù)沒(méi)有初始化,Perl會(huì)自動(dòng)創(chuàng)建一個(gè)間接Perl文件句柄,然后存儲(chǔ)在***個(gè)參數(shù)中,
例如:
- open(my$in,$infile)ordie"Couldn'tread$infile:$!";
- while(<$in>){
- #dosomethingwith$_
- }
- close$in;
還有一個(gè)方便之處是當(dāng)運(yùn)行到作用域外或者使用undefine時(shí),Perl文件句柄會(huì)
自動(dòng)關(guān)閉。
subfirstline{
open(my$in,shift)&&returnscalar<$in>;
#noclose()required
}
【編輯推薦】