如何在Windows上读取Perl中的管道输入?
我试图用Perl创建一些基本上类似于Unix如何在Windows上读取Perl中的管道输入?,windows,perl,pipe,stdin,Windows,Perl,Pipe,Stdin,我试图用Perl创建一些基本上类似于Unixtee命令的东西。我正在尝试读取STDIN的每一行,在其上运行替换,然后打印它。(最后,还可以将其打印到文件中。)如果我使用控制台输入,这是可行的,但如果我尝试将输入管道化到命令,它不会做任何事情。下面是一个简单的例子: print "about to loop\n"; while(<STDIN>) { s/2010/2009/; print; } print "done!\n"; 打印“即将循环\n”; while() { s/
tee
命令的东西。我正在尝试读取STDIN的每一行,在其上运行替换,然后打印它。(最后,还可以将其打印到文件中。)如果我使用控制台输入,这是可行的,但如果我尝试将输入管道化到命令,它不会做任何事情。下面是一个简单的例子:
print "about to loop\n";
while(<STDIN>)
{
s/2010/2009/;
print;
}
print "done!\n";
打印“即将循环\n”;
while()
{
s/2010/2009/;
印刷品;
}
打印“完成!\n”;
我尝试通过管道将dir命令传递给它,如下所示:
C:\perltest>dir | mytee.pl
about to loop
done!
C:\perltest>dir | mytee.pl
即将循环
完成!
为什么它看不到管道输入?(如果相关的话,我正在WinXP上使用Perl 5.10.0。)尝试:
C:\perltest>dir | perl mytee.pl
嗯,依我看,perl很难替代;)
dir | sed s/2009/2010/
尝试边做边学没有错,但快速搜索CPAN可以找到许多解决Perl中tee
问题的可能方法
例如:。可能是吗
包含标准输入的脚本
(标准输入)和标准输出(标准输出)
如果启动,可能无法正常工作
从命令提示符和
您可以使用文件关联来启动
剧本
这实际上是Windows处理IO重定向的一个错误。我现在正在寻找引用,但正是这个bug需要您指定
dir | perl filter.pl
而不是能够使用
dir | filter
请参阅Microsoft知识库文章:
HKEY\U LOCAL\U MACHINE\Software\Microsoft\Windows\CurrentVersion\Policys\Explorer
- 值名称:
InheritConsoleHandles
- 数据类型:
REG\u DWORD
- 基数:
Decimal
- 值数据:
1
管道:2010/03/19 03:48 PM 62过滤器。。。这是可行的,但是为什么我必须这样指定它呢?因为你在windows上。在unix上,您可以放置#/usr/bin/perl位于perl文件的顶部,告诉shell perl所在的位置。在windows上,只能直接执行.exe和.com文件。好的,在我的例子中,“c:\scripts”在%PATH%中,.PL在%PATHEXT%中。我希望能够从任何地方调用
foo | mytee
,而不必记住,在这种情况下,我需要在前面放一个“perl”,在后面放一个“.pl”。有什么建议或者我运气不好吗?@Jenni您可以使用pl2bat
将您的Perl脚本转换为批处理文件,然后Windows将乐于通过该文件。我找到了一个解决方法。我在c:\scripts中创建了一个“mytee.bat”文件。bat文件的第一行是@echo off
,第二行是perl c:\scripts\mytee.pl%1%2
。这是可行的——输入通过bat文件传输到perl脚本。由于PathText中.bat在.pl之前,因此“mytee”执行“mytee.bat”而不是perl脚本。我简化了脚本中与我的问题无关的部分。但perl是一个很好的替代品:“sed”不能被识别为内部或外部命令、可操作程序或批处理文件
;-)似乎是特定于操作系统的,它在我的OSX盒上运行得很好。这几乎是的一个副本。听起来这就是问题所在。我发现了一种解决方法,它涉及通过一个bat文件进行管道传输,然后调用perl可执行文件(请参阅已接受的答案)。谢谢+1@zoul我忙着查找信息,我没有注意到你已经发布了链接。谢谢sinan,非常有用的回答。这使得我不需要讨厌的批处理文件workaround@Jenni当然,缺点是,您无法确定inheritageConsoleHandles
是否已在您可能部署脚本的任何其他计算机上设置(这就是pl2bat.bat
的作用)。谢谢你接受我的回答。我发现这个windows错误无法可靠地修复。我第一次不得不使用dir | perl filter.pl。但是第二次,它只与dir | filter.pl一起工作。肮脏的
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