为perl STDIN分配特定值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为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可以是多行。

答案

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
";
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;
}

以上是关于为perl STDIN分配特定值的主要内容,如果未能解决你的问题,请参考以下文章

在 Perl 中从 STDIN 捕获退出状态

如何在 Perl 中测试 STDIN 而不会阻塞?

Python print -> Perl STDIN 跳行问题

如何在 perl 中为反引号加载 STDIN(不写入临时文件)

如何将动态内存分配的数组调整为特定值?

为啥 STDIN 会导致我的 Perl 程序冻结?