以下打开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参数打开。
答案 0 :(得分:2)
在双参数(和单参数)表单中,打开
<-
或-
打开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);