3 回答
TA贡献1856条经验 获得超11个赞
词法文件句柄可以很容易地作为参数传递,而文件句柄则不能。Typeglob可以(或者至少是对它们的引用可以),但这有点混乱。考虑使用词法变量,并确保先声明它们,这样您就知道它们确实是词法而不是局部或全局的。即
my $fh;
open $fh, $filename;
也可以考虑使用IO::Handle或IO::File作为选项。以前是这样,FileHandle但下面的ysth告诉我,FileHandle现在仅轮流使用'IO :: Handle',这对5.6以来的我来说是个新闻,但是这里有很多东西要学习。:-)
另外,别忘了use strict:-)
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'); #作品
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, $!));
...
- 3 回答
- 0 关注
- 442 浏览
添加回答
举报