哪一个是好习惯,一个词法文件句柄还是一个类型的?

pow*_*boy 14 perl

有人说我们应该使用词法文件句柄而不是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最重要的缺点是

  1. 它们总是在全球范围内,这可能导致像这样的阴险错误:

    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;
    
  2. 它们更难传递到子程序而不是词法文件句柄

    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)

所以你不要创建永久的全局变量.


eru*_*orm 8

词法文件句柄可以作为参数轻松传递,文件句柄不能.Typeglobs可以(或者至少可以引用它们),但这有点混乱.考虑坚持使用词汇变量,并确保首先声明它们,这样你才能知道它们是真正的词汇,而不是本地或全局.即

my $fh;
open $fh, $filename;
Run Code Online (Sandbox Code Playgroud)

还可以考虑使用IO::HandleIO::File作为选项.以前是FileHandle,但被告知YSTH低于FileHandle现在只是使用"IO ::句柄"反过来,这消息给我,因为5.6,但有很多在这里学习.:-)

另外,别忘了use strict:-)

  • "打开我的$ fh,......"是完全合法的(实际上这是通常的习语).不需要两条线. (13认同)