我如何在Windows上读取pipe道input?

我正在尝试在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重定向可能不起作用如果从文件关联开始 :

  1. 启动注册表编辑器
  2. 找到并单击以下注册表项中的项: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
  3. 在编辑菜单上,单击添加值,然后添加以下注册表值:
    • 值名称: InheritConsoleHandles
    • 数据类型: REG_DWORD
    • 基数: Decimal
    • 价值数据: 1
  4. 退出注册表编辑器。
  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/