我正在尝试在Perl中创build基本类似于Unix tee
命令的东西。 我试图阅读STDIN
每一行,运行一个替代,并打印出来。 (最后,也打印到一个文件。)这工作,如果我使用控制台input,但如果我尝试pipe道input命令它什么都不做。 这是一个简单的例子:
print "about to loop\n"; while(<STDIN>) { s/2010/2009/; print; } print "done!\n";
我尝试pipe道dir命令,像这样:
C:\ perltest> dir | mytee.pl 即将循环 完成了!
为什么没有看到pipe道input? (我在WinXP上使用Perl 5.10.0,如果这是相关的。)
这实际上是Windows处理IO重定向的一个错误。 我现在正在寻找参考,但是这是需要你指定的错误
dir | perl filter.pl
而不是能够使用
dir | filter
请参阅Microsoft知识库文章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(<>){ 打印“管道:$ _”; }
C:\ Temp> dir | 过滤 管道:驱动器C中的卷是MAIN 管道:卷序列号是XXXX-XXXX 管道: 管道:C:\ Temp>目录 管道: 管道:2010/03/19 03:48 PM。 管道:2010/03/19 03:48 PM 管道:2010/03/19 03:33 PM 32米 管道:2010/03/19 03:48 PM 62 filter.pl
尝试:
C:\perltest>dir | perl mytee.pl
它可能是微软KB#321788 ?
包含标准输入(STDIN)和标准输出(STDOUT)的脚本可能无法正常工作,如果您从命令提示符启动程序并使用文件关联来启动脚本。
尝试边干边学也没什么不好,但是对CPAN的快速搜索为Perl的问题展示了许多可能的解决方案。
例如: PerlIO :: Tee 。
那么恕我直言,perl是可怜的替代sed ;)
dir | sed s/2009/2010/