2- 与 3-参数以 '-' 开头

2- vs 3-argument open with '-'

以下打开 STDIN 然后回显用户输入:

open my $in, '-';
print "You said: $_" while(<$in>);

但是,以下代码段因为找不到任何名为“-”的文件而终止:

open my $in, '<', '-'; # dies
print "You said: $_" while(<$in>);

为什么两个参数 open 对此有效,而三个参数 open 却死了?我希望有一种基于用户输入打开文件或 STDIN 的简单方法,我不想使用 2 参数打开。

perldoc -f open:

In the two-argument (and one-argument) form, opening <- or - opens STDIN and opening >- opens STDOUT.

我认为这清楚地表明 - 的特殊处理特定于一个或两个参数形式。

您可以将 \*STDIN 分配给您的 $in,或者根据用户输入打开文件。

如前所述,您可以使用 STDIN 而不是显式打开它,

use autodie;

my $in;
$in = ($file eq "-") ? \*STDIN : open($in, "<", $file) && $in;

三参数打开失败,因为没有名为 - 的文件。这就是 three-arg open 的全部意义所在。必须有一种打开文件的方法,而不会将文件名视为代码!


这应该可以解决问题:

open(STDIN, '<', $qfn)
   if $qfn;

从技术上讲,有一种方法可以用三个参数打开 STDIN open

# Creates a new system handle (file descriptor).
open(my $fh, '<&', fileno(STDIN));
open(my $fh, '<&', \*STDIN);
open(my $fh, '<', "/proc/$$/fd/".fileno(STDIN));  # Linux

# Creates a new Perl handle for the existing system handle
open(my $fh, '<&=', fileno(STDIN));
open(my $fh, '<&=', \*STDIN);