这个问题的答案描述了如何伪造输入到<STDIN>
. 我的目标类似于那个问题:我的单元测试需要伪造输入到<>
.
当我将相同的技术应用于伪造输入时<>
,它不起作用。的介绍性解释<>
使我相信,当命令行上没有给出文件时,它是从 STDIN 读取的,但情况似乎并非如此。
我正在尝试制作的样本:
#!/usr/bin/perl -w
use strict;
use warnings;
use Carp;
use English qw( -no_match_vars );
sub fake1 {
my $fakeinput = "asdf\n";
open my $stdin, '<', \$fakeinput
or croak "Cannot open STDIN to read from string: $ERRNO";
local *STDIN = $stdin;
my $line = <>;
print "fake1 line is $line\n";
return 0;
}
sub fake2 {
my $fakeinput = "asdf\n";
open my $stdin, '<', \$fakeinput
or croak "Cannot open STDIN to read from string: $ERRNO";
local *STDIN = $stdin;
my $line = <STDIN>;
print "fake2 line is $line\n";
return 0;
}
fake1();
fake2();
fake2
工作,fake1
不。一个示例会话(“qwerty”是我输入的):
$ perl /tmp/diamond.pl
qwerty
fake1 line is qwerty
fake2 line is asdf
我的问题:
- 我怎样才能伪造输入
<>
? - 命令行上没有给出文件
<>
和没有给出文件有什么区别?<STDIN>
(即为什么链接问题中的技术适用于<STDIN>
但不适用于<>
?)
谢谢。