我正在尝试在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!
为什么没有看到管道输入? (我在WinXP上使用Perl 5.10.0,如果这是相关的。)
答案 0 :(得分:25)
这实际上是Windows处理IO重定向的一个错误。我现在正在寻找引用,但是这个bug需要你指定
dir | perl filter.pl
而不是能够使用
dir | filter
请参阅Microsoft知识库文章STDIN/STDOUT Redirection May Not Work If Started from a File Association:
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
答案 1 :(得分:12)
尝试:
C:\perltest>dir | perl mytee.pl
答案 2 :(得分:6)
可能是Microsoft KB #321788吗?
包含标准输入的脚本 (STDIN)和标准输出(STDOUT) 如果你开始可能无法正常工作 来自命令提示符的程序和 您使用文件关联来启动 脚本。
答案 3 :(得分:1)
尝试通过实践来学习并没有错,但快速搜索CPAN会为Perl问题中的tee
显示许多可能的解决方案。
例如:PerlIO::Tee。
答案 4 :(得分:0)
恕我直言,perl不能代替sed;)
dir | sed s/2009/2010/