【发布时间】:2011-09-10 01:58:57
【问题描述】:
The answers to this question 描述如何伪造<STDIN> 的输入。我的目标与那个问题类似:我的单元测试需要伪造<> 的输入。
当我对<> 的虚假输入应用相同的技术时,它不起作用。 <> 的介绍性解释让我相信,当命令行上没有给出文件时,它是从 STDIN 读取的,但情况似乎并非如此。
我正在尝试制作的示例:
#!/usr/bin/perl -w
use strict;
use warnings;
use Carp;
use English qw( -no_match_vars );
sub fake1 {
my $fakeinput = "asdf\n";
open my $stdin, '<', \$fakeinput
or croak "Cannot open STDIN to read from string: $ERRNO";
local *STDIN = $stdin;
my $line = <>;
print "fake1 line is $line\n";
return 0;
}
sub fake2 {
my $fakeinput = "asdf\n";
open my $stdin, '<', \$fakeinput
or croak "Cannot open STDIN to read from string: $ERRNO";
local *STDIN = $stdin;
my $line = <STDIN>;
print "fake2 line is $line\n";
return 0;
}
fake1();
fake2();
fake2 有效,fake1 无效。一个示例会话(“qwerty”是我输入的):
$ perl /tmp/diamond.pl
qwerty
fake1 line is qwerty
fake2 line is asdf
我的问题:
- 如何伪造
<>的输入? - 在命令行没有给出文件时
<>和<STDIN>有什么区别? (即为什么链接问题中的技术适用于<STDIN>,但不适用于<>?)
谢谢。
【问题讨论】:
-
仔细阅读 perlop 的文档(I/O operators),看起来
<>使用了魔法。那里有一个修改@ARGV的相关示例,但我不确定我的测试能否可靠地保证它是<>的第一个实例,或者修改@ARGV是安全的。 -
我不明白为什么不直接使用
local @ARGV = ...。 -
@tchrist - 这将如何运作?
标签: perl unit-testing io diamond-operator