1

selectを使用してシステム関数のstdoutを変更しようとしています。しかし、それは機能していないようです。システム出力は、ファイルにリダイレクトされるのではなく、コンソールに表示されます。

use strict;
use warnings;

chdir "C:\\Documents and Settings\\" or die "cannot open the dir\n";
open FH, ">out.txt" or die "cannot open out.txt\n";
select FH or die " cannot change the stdout\n";
system "dir /a" ; 

できますがsystem "dir /a > out.txt"、上記のコードが機能しない理由を知りたいです。

4

5 に答える 5

3

このselect関数は、出力のデフォルトのファイルハンドルを変更します。STDOUTは変更されません。これは、出力のデフォルトのファイルハンドルであるかどうかに関係なく、それが指すものを指します。STDOUTを変更したい場合は、ylebreやJonの答えのようなことをしなければなりません。

子プロセスを開始すると、親と同じ標準出力が得られます。ただし、親のデフォルトのファイルハンドルが何であるかは関係ありません。

于 2009-06-13T21:31:52.507 に答える
2

コードの問題は、systemコマンドが出力をキャプチャしないことです。使用できますqx//

use strict;
use warnings;

open my $fh, ">", "output.txt" or die $!;
my $oldfh= select $fh;
print qx/ls -a/;
select $oldfh;
close $fh or warn $!;

IPC::Open2IPC::Open3モジュールなど、外部アプリケーションを実行してその出力を読み取るためのオプションは他にもあります。これらはデフォルトで perl に含まれています。

補足: ファイル ハンドルにグロブを使用しないでください。グロブはグローバルであり、グローバルは悪です。代わりにレキシカル変数を使用してください ( FHvs. $fh)。また、open前者は後者よりも安全であるため、2 つのパラメーターの代わりに 3 つの引数を使用する必要があります。

于 2009-06-13T16:14:56.467 に答える
1

この場合、「select」が探しているものかどうかわかりません。STDOUT をファイルにリダイレクトするには、次のようにします。

use strict;
use warnings;
use IO::Handle;
open FH, "> out.txt";
STDOUT->fdopen( \*FH, 'w' ) or die $!;
print "Hello world!\n";
system "dir /a";

お役に立てれば!

于 2009-06-13T15:58:02.887 に答える
1

たぶんこれが役立つ

于 2009-06-13T16:08:07.543 に答える