这些“开放”格式之间有什么区别

时间:2011-03-29 21:19:04

标签: perl file-io syntax

我使用这种语法来打开我的文件,因为我在几年前的培训中学到了这些,而且我也以同样的方式做了这些书。

open( INPUTFILE, "< $input_file" ) || die "Can't open $input_file: $!";

前几天我在SO中回答了这个表格:

open( $input_file, "<", $input_file ) || die "Can't open $input_file: $!";

这种格式是新的还是只是以不同的方式,使用普通变量作为文件句柄?

我应该更改为“新”格式吗?它有一些优点,还是“旧”格式有一些缺点?

3 个答案:

答案 0 :(得分:11)

您应该使用三参数版本,因为它可以防止具有疯狂名称的文件。请考虑以下事项:

my $file = "<file.txt";
open( INPUTFILE, "< $file" ) or die "$!";

这将插入为:

open( INPUTFILE, "< <file.txt" ) or die "$!";

...意味着您实际上会打开一个名为file.txt的文件,而不是名为<file.txt的文件。

现在,对于文件句柄,您想要使用词法文件句柄:

open( my $fh, "<", $file.txt ) or die "$!";

原因是当$fh超出范围时,文件将关闭。此外,另一种类型的文件句柄(我不记得它的名称)具有全局范围。程序员并不是那么富有想象力,因此您可能会将文件句柄INPUTFILEFHFILEHANDLE命名为。如果其他人在你使用的模块中做了同样的命名,他们的文件句柄INPUTFILE会发生什么?好吧,它们都是有效的,而另一个则是有效的。哪一个clobbers?谁知道。这取决于它们何时打开。结束?如果其他程序员打开INPUTFILE但实际打开它进行写入会发生什么?世界末日,我的朋友,世界末日。

如果你使用词法文件句柄($fh),你不必担心世界结束,因为即使其他程序员确实称它为$fh,变量范围也可以保护你免受攻击。

所以是的,总是使用open()的三参数形式和词法文件句柄。拯救世界。

答案 1 :(得分:3)

open和三个参数形式的两个参数形式之间的区别与文件名在包含特殊字符时的处理方式有关。例如,在打开的两个参数中,如果文件名包含|字符或许多其他特殊字符,则将使用shell打开该文件。因此,在打开两个参数的情况下,可以编写如下内容:

 open my $file, 'rm -rf * |';

并且perl会在运行删除你的系统时愉快地打开导管到rm的输出。

如果您使用open的三个参数形式,那么文件名永远不会通过shell传递,如果您从不受信任的来源获取文件名,则更安全。

我还发现三个参数形式不那么模糊,因为它强迫你指定你是在阅读,写作还是追加。

您可以在manual page上获取所有开放的血腥细节。

答案 2 :(得分:1)

来自the perl tutorial

  

还有一个3参数版本   打开,让你放入特别的   将角色重定向到自己的角色   参数:

open( INFO, ">", $datafile ) || die "Can't create $datafile: $!";
  

在这种情况下,要打开的文件名是   $ datafile中的实际字符串,所以   你不必担心   包含字符的$ datafile   可能会影响开放模式,或   开头的空白   将被吸收的文件名   2参数版本。还有,任何   减少不必要的字符串   插值是一件好事。

因此open的3个参数版本是最安全的。