【问题标题】:What are the differences between these "open" formats这些“开放”格式有什么区别
【发布时间】:2011-07-25 15:27:50
【问题描述】:

我使用这种语法来打开我的文件,因为几年前我在一次培训中了解到这一点,而我所拥有的书籍也是这样做的。

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

几天前,我在一个 SO 中看到了这个表单:

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

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

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

【问题讨论】:

标签: perl file-io syntax


【解决方案1】:

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

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

这将插入为:

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

...这意味着您实际上将打开一个名为 file.txt 的文件,而不是一个名为 &lt;file.txt 的文件。

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

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

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

如果您使用词法文件句柄($fh),则不必担心世界末日,因为即使其他程序员确实将其称为 $fh,变量范围也会保护您免受破坏。

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

【讨论】:

    【解决方案2】:

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

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

    perl 会在运行删除您的系统时愉快地打开到rm 输出的管道。

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

    我还发现三参数形式不太含糊,因为它强制您指定您是在阅读、写作还是追加。

    您可以在manual page 上获取所有关于 open 的血腥细节。

    【讨论】:

      【解决方案3】:

      来自the perl tutorial

      还有一个 3 参数版本 打开,它可以让你把特殊的 将字符重定向到自己的 论据:

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

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

      所以open 的3 个参数版本是最安全的使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-16
        • 1970-01-01
        • 2014-06-22
        相关资源
        最近更新 更多