我正在执行测试,需要在perl代码中为STDIN分配一个特定的值。
所以不要像这样从stdin读取:
#myperl.pl
#!//usr/bin/env perl
#
while (<>) {
print;
}
# echo hello | ./myperl.pl
hello
我可以这样做:
#myperl.pl
#!//usr/bin/env perl
#
<STDIN> = "hello";
while (<>) {
print;
}
./myperl.pl
# hello
当然,在实际的测试用例场景中,文本hello
可以是多行。
答案 0 :(得分:1)
根据perldoc open
:
[...]您可以通过以下方式直接将文件句柄打开到Perl标量:
open(my $fh, ">", \$variable) || ..
另请参见PerlIO::scalar。此外,根据perldoc perlop:
空文件句柄<>很特殊:它可以用来模拟
sed
和awk
的行为,以及任何其他采用 文件名列表,对所有 他们。<>
的输入来自标准输入,也可以来自每个输入 命令行上列出的文件。运作方式如下:第一次 评估<>
,检查@ARGV
数组,如果为空,则$ARGV[0]
设置为"-"
,当打开时将为您提供标准输入。@ARGV
然后将数组作为文件名列表处理。
因此,当您执行while (<>)
时,它将尝试“打开标准输入”(前提是您未提供命令行参数,即@ARGV
为空)。该open
命令不受变量STDIN
当前值的影响,(我想)它只会做类似的事情:
open ARGV, '/dev/tty' or die "open: /dev/tty: $!";
因此,似乎无法通过更改<>
重新定义STDIN
从字符串读取的行为。
但是如果您可以使用<>
来代替循环中使用空文件句柄<STDIN>
,那么可以将STDIN
重新定义为字符串文件句柄:
use strict;
use warnings;
my $str = "hello\n";
open my $fh, "<", \$str or die "Could not open string file handle: $!";
{
local *STDIN = $fh;
while (<STDIN>) {
print;
}
}
close $fh;
my $line = <STDIN>;
print "Terminal input: ", $line;
修改:
以下内容似乎也可行:
local *ARGV = $fh;
while (<>) {
print;
}