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

Jen*_*nni 18 windows perl stdin pipe

我试图在Perl中创建一些基本上像Unix tee命令的东西.我正在尝试阅读每一行STDIN,在其上运行替换,然后打印它.(最后,也将它打印到一个文件.)如果我使用控制台输入,这是有效的,但如果我尝试将输入管道输入到命令它不会做任何事情.这是一个简单的例子:

print "about to loop\n";
while(<STDIN>)
{
  s/2010/2009/;
  print;
}
print "done!\n";
Run Code Online (Sandbox Code Playgroud)

我尝试像这样管道dir命令:

C:\perltest>dir | mytee.pl
about to loop
done!

为什么没有看到管道输入?(我在WinXP上使用Perl 5.10.0,如果这是相关的.)

Sin*_*nür 25

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

dir | perl filter.pl
Run Code Online (Sandbox Code Playgroud)

而不是能够使用

dir | filter
Run Code Online (Sandbox Code Playgroud)

如果从文件关联启动,请参阅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 ( <> ) {
    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

  • @Jenni当然,缺点是你不能确定在你可能部署脚本的任何其他计算机上设置`Inh​​eritConsoleHandles`(这是`pl2bat.bat`的来源).谢谢你接受我的回答. (2认同)

cod*_*ict 12

尝试:

C:\perltest>dir | perl mytee.pl
Run Code Online (Sandbox Code Playgroud)

  • 因为你在窗户上.在unix上,你可以将#!/ usr/bin/perl放在perl文件的顶部,告诉shell是perl所在的.在Windows上,只能直接执行.exe和.com文件. (3认同)
  • @Jenni您可以使用`pl2bat`将Perl脚本转换为批处理文件,然后Windows将很乐意通过. (2认同)

zou*_*oul 6

可能是微软KB#321788

如果从命令提示符启动程序并使用文件关联启动脚本,则包含标准输入(STDIN)和标准输出(STDOUT)的脚本可能无法正常工作.