Как подделать информацию для оператора Perl? - PullRequest
13 голосов
/ 07 июня 2011

Ответы на этот вопрос описывают, как имитировать ввод в <STDIN>.Моя цель похожа на этот вопрос: мой модульный тест должен подделать ввод для <>.

Когда я применяю ту же самую технику для подделки ввода для <>, она не работает.Вводные объяснения <> привели меня к мысли, что он считывает данные из STDIN, когда в командной строке не передаются файлы, но, похоже, это не так.

Пример I 'm пытается заставить работать:

#!/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

Мои вопросы:

  1. Как мне подделать ввод для <>?
  2. В чем разница между <> и <STDIN>, если в командной строке не указаны файлы?(Т.е. почему методика в связанном вопросе работает для <STDIN>, но не для <>?)

Спасибо.

1 Ответ

9 голосов
/ 07 июня 2011

Попробуйте это в вашем первом тесте:

open ARGV, '<', \$fakeinput
      or croak "Cannot open STDIN to read from string: $ERRNO";

my $line = <>;
print "fake1 line is $line\n";

Недостатком является то, что он не «локальный» - не знаю, можете ли вы сделать его локальным или нет. (Вы можете сделать это несколько раз, сбрасывая перед каждым тестом.)

...