是否有任何理由open(...)在Perl中使用双参数形式而不是三个或更多参数版本?
我能想出的唯一原因是两个论证形式较短的明显观察.但假设冗长不是问题,是否有任何其他原因可以让你选择双参数形式open(...)?
一对和两个arg打开应用使用-Cswitch或openpragma 指定的任何默认层.三arg开放没有.在我看来,这种功能差异是选择其中一种的最有力的理由(并且选择将根据您的开放而变化).哪个是最简单的或最具描述性的或"最安全的"(你可以安全地使用带有任意文件名的双arg打开,它只是不方便)在模块代码中占据一席之地; 在脚本代码中,您可以更自由地选择是否支持默认图层.
此外,Damian Conway的档案啜食者需要打开一个arg
$_ = "filename";
$contents = readline!open(!((*{!$_},$/)=\$_));
Run Code Online (Sandbox Code Playgroud)
想象一下,您正在编写一个接受输入文件名的实用程序.具有合理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)
另一个小差异:两个参数形成修剪空间
$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)
将写入名称以空格开头的文件.
对于具有用户输入(或配置文件输入)的简短管理脚本,不必担心修剪文件名等细节.