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

kno*_*orv 2 perl

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

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

yst*_*sth 7

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

此外,Damian Conway的档案啜食者需要打开一个arg

$_ = "filename";
$contents = readline!open(!((*{!$_},$/)=\$_));
Run Code Online (Sandbox Code Playgroud)

  • 精氨酸!Perl高尔夫.记住Python家伙正在嘀咕着,"告诉你了!" (3认同)
  • @tsee:"Damian Conway"位应该警告你,这不是你实际使用的东西.无论如何,File :: Slurp :: read_file更短. (2认同)

dax*_*xim 6

想象一下,您正在编写一个接受输入文件名的实用程序.具有合理Unix经验的人习惯于替代-STDIN.只有在模式字符和文件名是一个字符串的情况下使用魔法形式时, 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
Run Code Online (Sandbox Code Playgroud)


kri*_*iss 5

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

$foo = " fic";
open(MH, ">$foo");
print MH "toto\n";
Run Code Online (Sandbox Code Playgroud)

写在名为fic的文件中

另一方面

$foo = " fic";
open(MH, ">", $foo);
print MH "toto\n";
Run Code Online (Sandbox Code Playgroud)

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

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