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