为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 <>是特殊的:它可以用来模拟
sed
和awk
的行为,以及任何其他带有文件名列表的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分配特定值的主要内容,如果未能解决你的问题,请参考以下文章
Python print -> Perl STDIN 跳行问题