亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

哪一個是最佳實踐,一個詞法文件句柄還是一個typeglob?

哪一個是最佳實踐,一個詞法文件句柄還是一個typeglob?

C++
慕后森 2020-01-05 08:00:05
有人說我們應該使用詞法文件句柄而不是typeglob,如下所示:open $fh, $filename;但是大多數Perl書籍,包括The Llama Book,都使用typeglob,如下所示:open LOGFILE, $filename;那有什么區別呢?哪一個被認為是更好的做法?
查看完整描述

3 回答

?
呼喚遠方

TA貢獻1856條經驗 獲得超11個贊

詞法文件句柄可以很容易地作為參數傳遞,而文件句柄則不能。Typeglob可以(或者至少是對它們的引用可以),但這有點混亂??紤]使用詞法變量,并確保先聲明它們,這樣您就知道它們確實是詞法而不是局部或全局的。即


my $fh;

open $fh, $filename;

也可以考慮使用IO::Handle或IO::File作為選項。以前是這樣,FileHandle但下面的ysth告訴我,FileHandle現在僅輪流使用'IO :: Handle',這對5.6以來的我來說是個新聞,但是這里有很多東西要學習。:-)


另外,別忘了use strict:-)



查看完整回答
反對 回復 2020-01-06
?
拉丁的傳說

TA貢獻1789條經驗 獲得超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'); #作品



查看完整回答
反對 回復 2020-01-06
?
米脂

TA貢獻1836條經驗 獲得超3個贊

不建議使用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, $!));

...


查看完整回答
反對 回復 2020-01-06
  • 3 回答
  • 0 關注
  • 481 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號