Подтвердить что ты не робот

Как я могу читать входящие сообщения в Perl в Windows?

Я пытаюсь создать что-то в Perl, что в основном похоже на команду Unix tee. Я пытаюсь прочитать каждую строку STDIN, запустить подстановку на ней и распечатать ее. (И, в конце концов, также распечатайте его в файле.) Это работает, если я использую консольный ввод, но если я попытаюсь передать вход в команду, он ничего не сделает. Вот простой пример:

print "about to loop\n";
while(<STDIN>)
{
  s/2010/2009/;
  print;
}
print "done!\n";

Я пытаюсь передать ему команду dir следующим образом:

C:\perltest>dir | mytee.pl
about to loop
done!

Почему он не видит входной канал? (Я использую Perl 5.10.0 для WinXP, если это имеет значение.)

4b9b3361

Ответ 1

На самом деле это ошибка в том, как Windows обрабатывает перенаправление ввода-вывода. Я ищу ссылку прямо сейчас, но это ошибка, которая требует указать

dir | perl filter.pl

вместо того, чтобы использовать

dir | filter

См. статью Microsoft KB Перенаправление STDIN/STDOUT может не работать при запуске из файловой ассоциации:

  • Запустите редактор реестра.
  • Найдите и выделите следующий раздел реестра: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
  • В меню "Правка" нажмите "Добавить значение", а затем добавьте следующее значение реестра:
    • Имя значения: InheritConsoleHandles
    • Тип данных: REG_DWORD
    • Radix: Decimal
    • Данные значения: 1
  • Закройте редактор реестра.
C:\Temp> cat filter.pl
#!/usr/bin/perl

while ( <> ) {
    print "piped: $_";
}
C:\Temp> dir | filter
piped:  Volume in drive C is MAIN
piped:  Volume Serial Number is XXXX-XXXX
piped:
piped:  Directory of C:\Temp>
piped:
piped: 2010/03/19  03:48 PM              .
piped: 2010/03/19  03:48 PM              ..
piped: 2010/03/19  03:33 PM                32 m.pm
piped: 2010/03/19  03:48 PM                62 filter.pl

Ответ 2

Try:

C:\perltest>dir | perl mytee.pl

Ответ 3

Может ли быть Microsoft KB # 321788?

Скрипты, содержащие стандартный ввод (STDIN) и стандартный выход (STDOUT) может работать неправильно, если вы начинаете программа из командной строки и вы используете файловую ассоциацию для запуска script.

Ответ 4

Нет ничего плохого в том, чтобы пытаться учиться, но быстрый поиск CPAN показывает ряд возможных решений для проблемы tee в Perl.

Например: PerlIO::Tee.

Ответ 5

Хорошо ИМХО, perl плохо заменяет sed;)

dir | sed s/2009/2010/