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
才不是。示例 session (“qwerty”是我输入的):
$ perl /tmp/diamond.pl
qwerty
fake1 line is qwerty
fake2 line is asdf
我的问题:
- 如何伪造
<>
的输入? <>
之间有什么区别和<STDIN>
当命令行上没有给出文件时? (即为什么链接问题中的技术适用于<STDIN>
但不适用于<>
?)
谢谢。
最佳答案
在第一次测试中尝试一下:
open ARGV, '<', \$fakeinput
or croak "Cannot open STDIN to read from string: $ERRNO";
my $line = <>;
print "fake1 line is $line\n";
这有一个缺点,那就是不是“本地化”——不知道是否可以将其本地化。 (不过,您可以多次执行此操作,并在每次测试之前重置。)
关于perl - 如何伪造 Perl 钻石运算符的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6265790/