-2

ディレクトリコマンドの出力をファイルハンドルにパイプし、続いてファイルハンドルに出力します。dir/ls出力にテキストを追加したいと思います。

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

Perlスクリプトを実行すると、ディレクトリの内容は表示されますが、printステートメントを使用して印刷されたテキストは表示されません。この場合、一部のテキストは表示されません。私は何が欠けていますか?

より詳細に説明するために-パイプディレクトリの内容をFHに渡し、続いて同じファイルハンドルFHにテキストを追加します。リンクhttp://perldoc.perl.org/perlopentut.html#Pipe-Opensを参照しました

4

2 に答える 2

0

何もリダイレクトしていません: OS に応じて、スクリプトの出力をcmd.exeビルトインdirまたはエイリアスのいずれかにパイプしています (つまり、 Windows のパスにlsCygwin を使用してこのスクリプトを実行すると、問題が発生する可能性があります)。ls

への書き込み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 に答える
0

printで FH に書き込み、次のステートメントで FH から読み取ることはできません。ファイル ハンドルは FIFO ではありません (デフォルト)。open は書き込み可能なファイル ハンドルを提供し、その読み取り側は の標準入力に接続されdirます。書き込みファイルハンドルから読み取っても、何も得られません。

あなたは実際に何を達成したいですか?テキストをプログラムに送信するか、dirプログラムの出力を読み取りますdirか?

コメントでコマンドの出力を読みたいと言ったのでdir、 open コマンドが間違っています。Perl Open Tutorial"dir |"の代わりに使用"| dir"して読んでください。

多分これはあなたがやりたいことをします:

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