我正在执行测试,需要在perl代码中为STDIN分配特定值。
所以不要像这样读取stdin:
#myperl.pl#!// usr / bin / env perl#while(<>){打印;}
#…
根据 perldoc open :
perldoc open
[...]您可以通过以下方式直接打开文件句柄到Perl标量: open(my $fh, ">", \$variable) || ..
[...]您可以通过以下方式直接打开文件句柄到Perl标量:
open(my $fh, ">", \$variable) || ..
也可以看看 PerlIO的标量:: 。此外,根据 perldoc perlop :
空文件句柄&lt;&gt;很特别:它可以用来模仿 的行为 sed 和 awk 以及任何其他需要的Unix过滤程序 一个文件名列表,对所有输入的每一行做同样的事情 他们。输入来自 <> 来自标准输入,或来自每个 命令行中列出的文件。以下是它的工作原理:第一次 <> 被评估, @ARGV 检查数组,如果为空, $ARGV[0] 被设置为 "-" ,打开时为您提供标准输入。该 @ARGV 然后将数组作为文件名列表处理。
sed
awk
<>
@ARGV
$ARGV[0]
"-"
所以,当你这样做 while (<>) 它会尝试“打开标准输入”(前提是你没有给出命令行参数,即 @ARGV 是空的)。这个 open 命令不受变量当前值的影响 STDIN 相反(我猜)它会简单地做:
while (<>)
open
STDIN
open ARGV, '/dev/tty' or die "open: /dev/tty: $!";
所以似乎不可能重新定义的行为 <> 通过改变来读取字符串 STDIN 。
但不是使用空文件句柄 <> 在你的循环中,如果你可以使用 <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; }