Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Windows上读取Perl中的管道输入?_Windows_Perl_Pipe_Stdin - Fatal编程技术网

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

如何在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/

我试图用Perl创建一些基本上类似于Unix
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
  • 退出注册表编辑器
  • C:\Temp>cat filter.pl #!/usr/bin/perl 而(){ 打印“管道:美元”; } C:\Temp>dir |过滤器 管道:驱动器C中的卷是主卷 管道:卷序列号为XXXX-XXXX 管道: 管道:C:\Temp> 管道: 管道:2010/03/19 03:48下午。 管道:2010/03/19 03:48 PM。。 管道:2010/03/19 03:33 PM 32 m.PM
    管道: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