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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (178)

我试图在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。)

提问于
用户回答回答于
用户回答回答于

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

dir | perl filter.pl

而不是能够使用

dir | filter

见microsoft KB文章如果从文件关联开始,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

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励