Я пытаюсь создать что-то в 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, если это релевантно.)
На самом деле это ошибка в том, как Windows обрабатывает перенаправление ввода-вывода. Я ищу ссылку прямо сейчас, но это ошибка, из-за которой вы должны указать
dir | perl filter.pl
, а не использовать
dir | filter
См. Статью Microsoft KB Перенаправление STDIN / STDOUT может не работать при запуске из файла Ассоциация :
HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ CurrentVersion \ Policies \ Explorer
InheritConsoleHandles
REG_DWORD
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
ИМХО, perl - плохая замена для sed ;)
dir | sed s / 2009/2010 /
Нет ничего плохого в том, чтобы пытаться учиться на практике, но быстрый поиск в CPAN показывает ряд возможных решений проблемы tee
в Perl.
Например: PerlIO :: Tee .
Может ли это быть Microsoft KB #321788?
Скрипты, содержащие стандартный ввод (STDIN) и стандартный выход (STDOUT) Может работать неправильно при запуске программа из командной строки и Для запуска используется сопоставление файлов скрипт.