首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Windows上读取Perl中的管道输入?

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

Stack Overflow用户
提问于 2018-01-29 05:45:05
回答 2查看 0关注 0票数 0

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

EN

回答 2

Stack Overflow用户

发布于 2018-01-29 13:55:40

这实际上是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
票数 0
EN

Stack Overflow用户

发布于 2018-01-29 14:47:07

C:\perltest>dir | perl mytee.pl
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档