Как я могу прочитать входные данные в Perl на Windows? - PullRequest
18 голосов
/ 19 марта 2010

Я пытаюсь создать что-то в 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, если это актуально.)

Ответы [ 5 ]

25 голосов
/ 19 марта 2010

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

dir | perl filter.pl

вместо возможности использования

dir | filter

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

  1. Запустите редактор реестра.
  2. Найдите и щелкните следующий ключ в реестре: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
  3. В меню Правка выберите пункт Добавить значение, а затем добавьте следующее значение реестра:
    • Имя значения: InheritConsoleHandles
    • Тип данных: REG_DWORD
    • Корень: Decimal
    • Значение данных: 1
  4. Выйти из редактора реестра.
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
12 голосов
/ 19 марта 2010

Попробуйте:

C:\perltest>dir | perl mytee.pl
6 голосов
/ 19 марта 2010

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

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

1 голос
/ 19 марта 2010

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

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

0 голосов
/ 19 марта 2010

Ну ИМХО, perl плохая замена sed ;)

dir | sed s/2009/2010/

...