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

发布于 2024-08-26 08:53:03 字数 433 浏览 6 评论 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,如果相关的话。)

I am trying to create something in Perl that is basically like the Unix tee command. I'm trying to read each line of STDIN, run a substitution on it, and print it. (And eventually, also print it to a file.) This works if I'm using console input, but if I try to pipe input to the command it doesn't do anything. Here's a simple example:

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

I try to pipe the dir command to it like this:

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

Why is it not seeing the piped input? (I'm using Perl 5.10.0 on WinXP, if that is relevant.)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

别闹i 2024-09-02 08:53:03

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

dir | perl filter.pl

而不是能够使用

dir | filter

请参阅 Microsoft 知识库文章 如果从文件关联启动,STDIN/STDOUT 重定向可能不起作用

  1. 启动注册表编辑器。
  2. 在注册表中找到并单击以下项:
    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
  3. 在“编辑”菜单上,单击“添加值”,然后添加以下注册表值:
    • 值名称:InheritConsoleHandles
    • 数据类型:REG_DWORD
    • 基数:十进制
    • 值数据: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

This is actually a bug in how Windows handles IO redirection. I am looking for the reference right now, but it is that bug that requires you to specify

dir | perl filter.pl

rather than being able to use

dir | filter

See Microsoft KB article STDIN/STDOUT Redirection May Not Work If Started from a File Association:

  1. Start Registry Editor.
  2. Locate and then click the following key in the registry:
    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
  3. On the Edit menu, click Add Value, and then add the following registry value:
    • Value name: InheritConsoleHandles
    • Data type: REG_DWORD
    • Radix: Decimal
    • Value data: 1
  4. Quit Registry Editor.
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
放赐 2024-09-02 08:53:03

尝试:

C:\perltest>dir | perl mytee.pl

Try:

C:\perltest>dir | perl mytee.pl
野却迷人 2024-09-02 08:53:03

可能是 Microsoft KB #321788 吗?

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

Could it be Microsoft KB #321788?

Scripts that contain standard input
(STDIN) and standard output (STDOUT)
may not work correctly if you start
the program from a command prompt and
you use a file association to start
the script.

泅人 2024-09-02 08:53:03

尝试通过实践来学习并没有什么错,但是快速搜索 CPAN 会显示 Perl 中的 tee 问题的许多可能的解决方案。

例如:PerlIO::Tee

There's nothing wrong with trying to learn by doing, but a quick search of CPAN shows a number of possible solutions for the tee in Perl problem.

For example: PerlIO::Tee.

油焖大侠 2024-09-02 08:53:03

嗯,恕我直言,perl 是 sed 的糟糕替代品;)

目录 | sed s/2009/2010/

Well IMHO, perl is poor substitute for sed ;)

dir | sed s/2009/2010/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文