Как подделать вход для оператора алмаза perl?
Ответы на этот вопрос описывают, как подделывать ввод в <STDIN>
. Моя цель аналогична этому вопросу: my unit test должен подделать ввод в <>
.
Когда я применяю тот же метод для подделки ввода в <>
, он не работает. Вводные объяснения <>
привели меня к мысли, что он читал из 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>
, когда в командной строке не указаны файлы? (I.e. Почему техника в связанном вопросе работает для <STDIN>
, но не для <>
?)
Спасибо.
Ответы
Ответ 1
Попробуйте это в своем первом тесте:
open ARGV, '<', \$fakeinput
or croak "Cannot open STDIN to read from string: $ERRNO";
my $line = <>;
print "fake1 line is $line\n";
У этого недостатка не быть "местным" - не знаю, можете ли вы сделать его локальным или нет.
(Вы можете сделать это несколько раз, но сбросьте перед каждым тестом.)