为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

白板的微信 2019-12-05 16:08:22
有人说我们应该使用词法文件句柄而不是typeglob,如下所示:open $fh, $filename;但是大多数Perl书籍,包括The Llama Book,都使用typeglob,如下所示:open LOGFILE, $filename;那有什么区别呢?哪一个被认为是更好的做法?
查看完整描述

3 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

词法文件句柄可以很容易地作为参数传递,而文件句柄则不能。Typeglob可以(或者至少是对它们的引用可以),但这有点混乱。考虑使用词法变量,并确保先声明它们,这样您就知道它们确实是词法而不是局部或全局的。即


my $fh;

open $fh, $filename;

也可以考虑使用IO::Handle或IO::File作为选项。以前是这样,FileHandle但下面的ysth告诉我,FileHandle现在仅轮流使用'IO :: Handle',这对5.6以来的我来说是个新闻,但是这里有很多东西要学习。:-)


另外,别忘了use strict:-)


查看完整回答
反对 回复 2019-12-05
?
胡说叔叔

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'); #作品


查看完整回答
反对 回复 2019-12-05
?
神不在的星期二

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, $!));

...


查看完整回答
反对 回复 2019-12-05
  • 3 回答
  • 0 关注
  • 542 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信