为什么使用自动化文件句柄的三参数公开调用是Perl的最佳实践?

我有两个关于Perl open函数的问题:

1)我似乎记得从Perl的最佳实践 ,3参数版本的open比两个参数版本更好,例如

 open(OUT, '>>', $file); 

 open(OUT, ">>$file"); 

这是为什么? 有一天我试着告诉某人使用3个参数的版本,但似乎没有任何支持。

2)我似乎还记得autovivified文件句柄在裸文件句柄(他们称为不同的东西)青睐? 也不记得为什么,例如

 open(my $out, '>>', $file); 

 open(OUT, '>>', $file); 

这是一个strict事情吗? 我似乎记得能够strict使用OUT ,但我不记得了。

  • 对于文件句柄(比如OUT ),使用typeglobs并不是一个好主意,因为它们在整个程序中是全局的 – 你需要确保包括模块中的其他例程在内的其他例程不会使用相同的名字(包括未来)。
  • 使用open的双参数forms将您的应用程序暴露给由包含特殊字符的variables引起的错误行为,例如my $f; open $f, ">$some_filename"; my $f; open $f, ">$some_filename"; 暴露在包含前导> $some_filename将会改变程序行为的bug中。

使用三参数forms可以避免这种情况,通过将模式和文件名分隔为不能干涉的独立参数。

此外,使用pipe道的参数forms是一个非常好的主意:

 open $pipe, '|-', 'sendmail', 'fred@somewhere.fake'; 

比单独做一个string更好 – 它避免了可能的shell注入等。

处理#2:

OUT是一个全局文件句柄,使用它会让你看到这样的隐患:

 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; 

要牢记的一个方面是双重forms被打破。 考虑一个名为“abc”的文件(即带有空白的文件名)。 您无法打开文件:

 open my $foo, ' abc' or die $!; open my $foo, '< abc' or die $!; open my $foo, '< abc' or die $!; # nothing works 

该空间被丢弃,所以文件不能再被find。 这种情况是非常不可能的,但绝对是一个问题。 这三种forms是免疫的:

 open my $foo, '<', ' abc' or die $!; # works 

来自perlmonks的这个线程和任何问题都是一样的讨论。 请记住,在2001年,三个参数表格仍被认为是新的 ,因此不适用于可移植代码,因为如果在5.005解释器上运行,Perl程序将会死于语法错误。 这不再是这样的情况:perl 5.005已经被废弃了,已经过时了。