Как я могу считать переданный по каналу вход в 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, если это релевантно.)

18
задан brian d foy 22 March 2010 в 16:34
поделиться

5 ответов

На самом деле это ошибка в том, как 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
    • Radix: 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
25
ответ дан 30 November 2019 в 06:50
поделиться

Попробуйте:

C:\perltest>dir | perl mytee.pl
12
ответ дан 30 November 2019 в 06:50
поделиться

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

dir | sed s / 2009/2010 /

0
ответ дан 30 November 2019 в 06:50
поделиться

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

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

1
ответ дан 30 November 2019 в 06:50
поделиться

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

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

6
ответ дан 30 November 2019 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: