猿问

哪一个是最佳实践,一个词法文件句柄还是一个typeglob?

有人说我们应该使用词法文件句柄而不是typeglob,如下所示:


open $fh, $filename;

但是大多数Perl书籍,包括The Llama Book,都使用typeglob,如下所示:


open LOGFILE, $filename;

那有什么区别呢?哪一个被认为是更好的做法?


慕后森
浏览 443回答 3
3回答

呼唤远方

词法文件句柄可以很容易地作为参数传递,而文件句柄则不能。Typeglob可以(或者至少是对它们的引用可以),但这有点混乱。考虑使用词法变量,并确保先声明它们,这样您就知道它们确实是词法而不是局部或全局的。即my $fh;open $fh, $filename;也可以考虑使用IO::Handle或IO::File作为选项。以前是这样,FileHandle但下面的ysth告诉我,FileHandle现在仅轮流使用'IO :: Handle',这对5.6以来的我来说是个新闻,但是这里有很多东西要学习。:-)另外,别忘了use strict:-)

拉丁的传说

Llama Book的最早版本是1993年,当时词汇文件句柄是Perl语言的一部分。出于多种原因,词汇文件句柄是一种更好的做法。Typeglob的最重要的缺点是它们的作用域始终是全局的,可能会导致如下所示的隐患:sub doSomething {&nbsp; 我的($ input)= @_;&nbsp; #让我们将$ input与我们从另一个文件读取的内容进行比较&nbsp; 打开(F,“ <”,$ anotherFile);&nbsp; @F = <F>;&nbsp;&nbsp; 关闭F;&nbsp; do_some_comparison($ input,@F);}打开(F,“ <”,$ myfile);而(<F>){&nbsp; &nbsp; doSomething($ _); #doh-刚刚关闭了F文件句柄}关闭F;它们比词汇文件句柄更难传递给子例程包package1;sub log_time {#打印时间戳到文件句柄&nbsp; &nbsp; 我的($ fh)= @_;&nbsp; &nbsp; 打印$ 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'); #作品

米脂

不建议使用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, $!));...
随时随地看视频慕课网APP
我要回答