为perl STDIN分配特定值

问题描述 投票:0回答:1

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

perl stdin
1个回答
0
投票

perldoc open说:

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

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

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

null filehandle <>是特殊的:它可以用来模拟sedawk的行为,以及任何其他带有文件名列表的Unix过滤器程序,对所有文件名的每一行输入做同样的操作。来自<>的输入来自标准输入,或来自命令行中列出的每个文件。以下是它的工作原理:第一次评估<>时,检查@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;
}
© www.soinside.com 2019 - 2024. All rights reserved.