有人说我们应该使用词法文件句柄而不是typeglob,如下所示:
open $fh, $filename;
Run Code Online (Sandbox Code Playgroud)
但大多数Perl书籍,包括The Llama Book,都使用了一个typeglob,如下所示:
open LOGFILE, $filename;
Run Code Online (Sandbox Code Playgroud)
那有什么区别?哪一个被认为是更好的做法?
mob*_*mob 22
最早版本的Llama Book是从1993年开始的,之前词汇文件是Perl语言的一部分.由于各种原因,词法文件句柄是更好的做法.typeglobs最重要的缺点是
它们总是在全球范围内,这可能导致像这样的阴险错误:
sub doSomething {
my ($input) = @_;
# let's compare $input to something we read from another file
open(F, "<", $anotherFile);
@F = <F>;
close F;
do_some_comparison($input, @F);
}
open(F, "<", $myfile);
while (<F>) {
doSomething($_); # do'h -- just closed the F filehandle
}
close F;
它们更难传递到子程序而不是词法文件句柄
package package1;
sub log_time { # print timestamp to filehandle
my ($fh) = @_;
print $fh scalar localtime, "\n";
}
package package2;
open GLOB, '>', 'log1';
open $lexical, '>', 'log2';
package1::log_time($lexical); # works as expected
package1::log_time(GLOB); # doesn't work
package1::log_time('GLOB'); # doesn't work
package1::log_time(*GLOB); # works
package1::log_time(package2::GLOB); # works
package1::log_time('package2::GLOB'); # works
另请参阅:为什么使用自动生成文件句柄的三参数打开调用是Perl的最佳实践?
Eug*_*ash 14
当使用词法变量时,文件句柄具有这些变量的范围,并在您离开该范围时自动关闭:
{
open my $fh, '<', 'file' or die $!;
# ...
# the fh is closed upon leaving the scope
}
Run Code Online (Sandbox Code Playgroud)
所以你不要创建永久的全局变量.
词法文件句柄可以作为参数轻松传递,文件句柄不能.Typeglobs可以(或者至少可以引用它们),但这有点混乱.考虑坚持使用词汇变量,并确保首先声明它们,这样你才能知道它们是真正的词汇,而不是本地或全局.即
my $fh;
open $fh, $filename;
Run Code Online (Sandbox Code Playgroud)
还可以考虑使用IO::Handle或IO::File作为选项.以前是FileHandle,但被告知YSTH低于FileHandle现在只是使用"IO ::句柄"反过来,这消息给我,因为5.6,但有很多在这里学习.:-)
另外,别忘了use strict:-)
| 归档时间: |
|
| 查看次数: |
4959 次 |
| 最近记录: |