2&3-argument打开' - '

时间:2015-05-30 00:34:27

标签: perl io stdin

以下打开product_info$total_qty <- with(...,col[match(1:nrow(product_info),row)]); 然后回显用户输入:

STDIN

但是,以下代码段会因为无法找到任何名为&#39; - &#39;:

的文件而死亡
open my $in, '-';
print "You said: $_" while(<$in>);

为什么双参数open my $in, '<', '-'; # dies print "You said: $_" while(<$in>); 适用于此但三参数open会死?我希望有一种基于用户输入打开文件或STDIN的简单方法,我不想使用2参数打开。

3 个答案:

答案 0 :(得分:2)

perldoc -f open

  

在双参数(和单参数)表单中,打开<--打开STDIN,打开>-打开STDOUT

我认为这清楚地表明-的特殊处理是针对一个或两个论证形式的。

您只需将\*STDIN分配给$in,或根据用户输入打开文件。

答案 1 :(得分:2)

如前所述,您可以使用STDIN代替明确打开它,

use autodie;

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

答案 2 :(得分:2)

三arg打开失败,因为没有名为-的文件。这就是三arg开放的重点。必须有一种打开文件的方法,而不会将文件名视为代码!

这应该可以解决问题:

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

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

# 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);