-2

我将目录命令输出传送到文件句柄,然后打印到文件句柄。我希望在 dir/ls 输出中附加一些文本。

open (FH, "| dir") or die "$OS_ERROR";
print FH ("sometext") or die "$OS_ERROR";
while (<FH>){
    print;
}

当我执行 Perl 脚本时,我看到了目录内容,但是我没有看到使用 print 语句打印的文本,在这种情况下我没有看到 sometext。我错过了什么?

更详细地解释 - 我想要管道目录内容到 FH,然后我想将一些文本附加到同一个文件句柄 FH 。我已经提到了链接http://perldoc.perl.org/perlpentut.html#Pipe-Opens

4

2 回答 2

0

您不能使用 FH 写入,print然后期望在下一条语句中从 FH 读取。文件句柄不是 FIFO(默认情况下)。open 给你一个可写的文件句柄,它的读取端连接到dir. 从写文件句柄中读取只会给你什么。

你真正想要达到什么目的?向程序发送一些文本dir,或读取dir程序的输出?

由于您在评论中说要阅读dir命令的输出,因此您的 open 命令错误;使用"dir |"而不是"| dir"阅读Perl Open Tutorial

也许这可以做你想做的事情:

open (FH, "dir|") or die "$OS_ERROR";
while (<FH>){
    print;
}
print "sometext\n";
于 2012-05-12T09:56:43.167 回答
0

您没有重定向任何内容:您将脚本的输出通过管道传输到cmd.exe内置dir或别名,ls具体取决于您的操作系统(这意味着,如果您ls在 Windows 上的路径中使用 Cygwin 运行此脚本,您可能会遇到麻烦)。

写信dir似乎没有用。如果您想过滤 dir输出,即从运行中获取输出dir并在打印之前对其进行操作,您应该将其通过管道传输到您的脚本中,并且您应该打印处理后的输出。

#!/usr/bin/env perl

use strict; use warnings;

my $pid = open my $dir_out, '-|', 'cmd.exe /c dir';
die "Cannot open pipe: $!\n" unless $pid;

my $output_file = 'output.txt';

open my $my_out, '>', $output_file
    or die "Cannot open '$output_file': $!";

while (my $line = <$dir_out>) {
    $line =~ s/bytes free/peons liberated/;
    print $my_out $line;
}

close $my_out
    or die "Cannot close '$output_file': $!";

close $dir_out 
    or die "Cannot close pipe: $!\n";

当然,我假设您的程序中还发生了其他事情,这只是其中的一小部分。否则,您不需要为简单的过滤器编写这么多代码。

于 2012-05-12T10:24:17.850 回答