如何在Windows上阅读Perl中的管道输入?

时间:2010-03-19 19:30:09

标签: windows perl pipe stdin

我正在尝试在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,如果这是相关的。)

5 个答案:

答案 0 :(得分:25)

这实际上是Windows处理IO重定向的一个错误。我现在正在寻找引用,但是这个bug需要你指定

dir | perl filter.pl

而不是能够使用

dir | filter

请参阅Microsoft知识库文章STDIN/STDOUT Redirection May Not Work If Started from a File Association

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