为perl STDIN指定特定值

时间:2019-03-03 16:09:28

标签: perl stdin

我正在执行测试,需要在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可以是多行。

1 个答案:

答案 0 :(得分:1)

根据perldoc open

  

[...]您可以通过以下方式直接将文件句柄打开到Perl标量:

open(my $fh, ">", \$variable) || ..   

另请参见PerlIO::scalar。此外,根据perldoc perlop

  

空文件句柄<>很特殊:它可以用来模拟   sedawk的行为,以及任何其他采用   文件名列表,对所有   他们。 <>的输入来自标准输入,也可以来自每个输入   命令行上列出的文件。运作方式如下:第一次   评估<>,检查@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;
}