3 回答

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

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

TA貢獻1963條經驗 獲得超6個贊
不建議使用typeglob文件句柄,因為如果您不注意它,可能會導致多個問題。例如:如果您要創建一個重復使用相同typeglob的遞歸函數,則在嘗試關閉文件句柄時會收到一些警告,除非您創建基于時間限制的基于包的glob。詞法變量的作用域是在其中定義它們的塊,而typeglob作用域是用于定義它的完整包的。
恢復:
如果要保留typeglob文件句柄,請確保創建基于時間限制的基于包的glob:
...
local *FH;
open FH, '<', $filepath or die(sprintf('Could not open %s: %s', $filepath, $!));
...
否則,請使用詞匯變量
...
open my $fh, '<', $filepath or die(sprintf('Could not open %s: %s', $filepath, $!));
...
- 3 回答
- 0 關注
- 592 瀏覽
添加回答
舉報