是否有理由在Perl中使用双参数形式的open(...)?

时间:2009-11-27 01:01:45

标签: perl

是否有任何理由在Perl中使用open(...)的双参数形式而不是三个或更多参数版本?

我能想出的唯一原因是两个论证形式较短的明显观察。但假设冗长不是问题,是否还有其他原因可以让您选择open(...)的双参数形式?

9 个答案:

答案 0 :(得分:7)

打开一个和两个arg将应用使用-C开关或open pragma指定的任何默认图层。三arg开放没有。在我看来,这种功能差异是选择其中一种的最有力的理由(并且选择将根据您的开放而变化)。哪个最简单,最具描述性或“最安全”(你可以安全地使用带有任意文件名的双arg打开,它只是不方便)在模块代码中占据一席之地;在脚本代码中,您可以更自由地选择是否支持默认图层。

此外,Damian Conway的文件啜食运算符

需要打开一个arg
$_ = "filename";
$contents = readline!open(!((*{!$_},$/)=\$_));

答案 1 :(得分:6)

想象一下,您正在编写一个接受输入文件名的实用程序。具有合理Unix经验的人习惯用-代替STDIN。只有在使用magical表单时,Perl才会自动处理,其中模式字符和文件名是一个字符串,否则你必须自己处理这个和类似的特殊情况。这是一个有点普遍的问题,我很惊讶没人发布。证明:

use IO::File qw();
my $user_supplied_file_name = '-';

IO::File->new($user_supplied_file_name, 'r') or warn "IO::File/non-magical mode - $!\n";
IO::File->new("<$user_supplied_file_name")   or warn "IO::File/magical mode - $!\n";
open my $fh1, '<', $user_supplied_file_name  or warn "non-magical open - $!\n";
open my $fh2, "<$user_supplied_file_name"    or warn "magical open - $!\n";

__DATA__
IO::File/non-magical mode - No such file or directory
non-magical open - No such file or directory

答案 2 :(得分:5)

另一个小差异:两个参数形成修剪空间

$foo = " fic";
open(MH, ">$foo");
print MH "toto\n";

写入名为fic的文件

另一方面

$foo = " fic";
open(MH, ">", $foo);
print MH "toto\n";

将写入名称以空格开头的文件。

对于带有用户输入(或配置文件输入)的简短管理脚本,不必费心去修剪文件名等细节。

答案 3 :(得分:4)

open的两个参数形式是perl的某些旧版本支持的唯一形式。

答案 4 :(得分:3)

如果您从管道打开,那么三个参数形式实际上并没有用。获得三个参数形式的等价物包括打开安全管道(open(FILE, '|-'))然后执行程序。

因此,对于简单的管道打开(例如open(FILE, 'ps ax |')),两个参数语法要紧凑得多。

答案 5 :(得分:3)

答案 6 :(得分:3)

使用open的双参数版本的一个原因是,如果要打开可能是管道或文件的内容。如果你有一个功能

sub strange
{
     my ($file) = @_;
     open my $input, $file or die $!;
}

然后你想用“file”这样的文件名来调用它:

strange ("file");

或像“zcat file.gz |”

这样的管道
strange ("zcat file.gz |");

根据您找到的文件的情况,可以使用双参数版本。您将在“遗留”Perl中看到上述构造。但是,最明智的做法可能是适当地打开文件句柄并将文件句柄发送到函数而不是像这样使用文件名。

答案 7 :(得分:2)

当您组合字符串或使用变量时,可能很不清楚'<''>'等是否已经存在。在这种情况下,我个人更喜欢可读性,这意味着,我使用更长的形式:

open($FILE, '>', $varfn);

当你只使用一个常量时,我​​更喜欢易于输入(实际上,考虑到短版本更好的可读性,或者至少甚至是长版本)。

open($FILE, '>somefile.xxx');

答案 8 :(得分:-3)

我猜你的意思是open(FH, '<filename.txt')而不是open(FH, '<', 'filename.txt')

我认为这只是一个偏好问题。我总是习惯于使用前者。