3 回答

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個(gè)贊
詞法文件句柄可以很容易地作為參數(shù)傳遞,而文件句柄則不能。Typeglob可以(或者至少是對(duì)它們的引用可以),但這有點(diǎn)混亂??紤]使用詞法變量,并確保先聲明它們,這樣您就知道它們確實(shí)是詞法而不是局部或全局的。即
my $fh;
open $fh, $filename;
也可以考慮使用IO::Handle或IO::File作為選項(xiàng)。以前是這樣,F(xiàn)ileHandle但下面的ysth告訴我,F(xiàn)ileHandle現(xiàn)在僅輪流使用'IO :: Handle',這對(duì)5.6以來(lái)的我來(lái)說(shuō)是個(gè)新聞,但是這里有很多東西要學(xué)習(xí)。:-)
另外,別忘了use strict:-)

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超8個(gè)贊
Llama Book的最早版本是1993年,當(dāng)時(shí)詞匯文件句柄是Perl語(yǔ)言的一部分。出于多種原因,詞匯文件句柄是一種更好的做法。Typeglob的最重要的缺點(diǎn)是
它們的作用域始終是全局的,可能會(huì)導(dǎo)致如下所示的隱患:
sub doSomething {
我的($ input)= @_;
#讓我們將$ input與我們從另一個(gè)文件讀取的內(nèi)容進(jìn)行比較
打開(kāi)(F,“ <”,$ anotherFile);
@F = <F>;
關(guān)閉F;
do_some_comparison($ input,@F);
}
打開(kāi)(F,“ <”,$ myfile);
而(<F>){
doSomething($ _); #doh-剛剛關(guān)閉了F文件句柄
}
關(guān)閉F;
它們比詞匯文件句柄更難傳遞給子例程
包package1;
sub log_time {#打印時(shí)間戳到文件句柄
我的($ fh)= @_;
打印$ fh標(biāo)量本地時(shí)間,“ \ n”;
}
包package2;
打開(kāi)GLOB,'>','log1';
打開(kāi)$ lexical,'>','log2';
package1 :: log_time($ lexical); #符合預(yù)期
package1 :: log_time(GLOB); #不起作用
package1 :: log_time('GLOB'); #不起作用
package1 :: log_time(* GLOB); #作品
package1 :: log_time(package2 :: GLOB); #作品
package1 :: log_time('package2 :: GLOB'); #作品

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊
不建議使用typeglob文件句柄,因?yàn)槿绻蛔⒁馑?,可能?huì)導(dǎo)致多個(gè)問(wèn)題。例如:如果您要?jiǎng)?chuàng)建一個(gè)重復(fù)使用相同typeglob的遞歸函數(shù),則在嘗試關(guān)閉文件句柄時(shí)會(huì)收到一些警告,除非您創(chuàng)建基于時(shí)間限制的基于包的glob。詞法變量的作用域是在其中定義它們的塊,而typeglob作用域是用于定義它的完整包的。
恢復(fù):
如果要保留typeglob文件句柄,請(qǐng)確保創(chuàng)建基于時(shí)間限制的基于包的glob:
...
local *FH;
open FH, '<', $filepath or die(sprintf('Could not open %s: %s', $filepath, $!));
...
否則,請(qǐng)使用詞匯變量
...
open my $fh, '<', $filepath or die(sprintf('Could not open %s: %s', $filepath, $!));
...
- 3 回答
- 0 關(guān)注
- 597 瀏覽
添加回答
舉報(bào)