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 参数打开。
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);
以下打开 STDIN
然后回显用户输入:
open my $in, '-';
print "You said: $_" while(<$in>);
但是,以下代码段因为找不到任何名为“-”的文件而终止:
open my $in, '<', '-'; # dies
print "You said: $_" while(<$in>);
为什么两个参数 open
对此有效,而三个参数 open
却死了?我希望有一种基于用户输入打开文件或 STDIN 的简单方法,我不想使用 2 参数打开。
In the two-argument (and one-argument) form, opening
<-
or-
opensSTDIN
and opening>-
opensSTDOUT
.
我认为这清楚地表明 -
的特殊处理特定于一个或两个参数形式。
您可以将 \*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);