0

これを尋ねるのはばかげていると思いますが、いくつか試してみましたが、どこに行くべきかわかりません。

Expect.pm ドキュメントから:

$object->log_file("filename" | $filehandle | \&coderef | undef)

セッションをファイルに記録します。生成されたプロセスとの間で送受信されるすべての文字がファイルに書き込まれます。

$filehandle を log_file に渡したいです。しかし、私がこれを試したとき:

open (LOG, ">>" .$opt{l});
my $sess = Expect->spawn("telnet $ip");
$sess->log_file(LOG)

スクリプトを実行しているディレクトリに「LOG」という名前のファイルを取得します。いくつかの調査の後、私はこれを試しました:

open (LOG, ">>" .$opt{l});
my $sess = Expect->spawn("telnet $ip");
my $fh = *LOG;
$sess->log_file($fh)

これで、ディレクトリで名前が付けられたファイルを取得します*main::LOG。オプションで指定した名前の別のファイルもあり-lますが、送信する行のみが含まれていますprint LOG

ファイル処理機能が関数に組み込まれているかどうか、または何か間違っているかどうかはわかりません。

4

3 に答える 3

4

という名前のベアワードファイルハンドルがある場合は、(これについてはで詳しく読むことができます)LOGと言うことで関数に渡すことができますが、そうしないでください。ベアワードファイルハンドルは非常に古いスタイルであるため、使用しないでください。字句ファイルハンドルとopenの3つの引数バージョンを使用してみてください。\*LOGperldoc perldata

open my $log, ">>", $opt{l}
    or die "could not open $opt{l}: $!";

過去に$log使用した場所ならどこでも使用できます。LOG

strictまた、warningsプラグマを使用する必要があります。

于 2010-09-15T16:15:26.747 に答える
1

レキシカル ファイルハンドル (および 3 つの引数open, and die) を使用してみてください:

open my $logfh, ">>", $opt{l} or die "Could not open log file $opt{l}: $!\n";
$sess->log_file( $logfh );

LOGは信じられないほど一般的であり、コードのどこかで別のファイルハンドルを切り捨てられている (または切り捨てられている) 可能性があります。レキシカル ファイルハンドルを使用すると、混乱を防ぐことができます。また、実際にファイルを開くことができない場合に備えて、 open()(または)の戻りステータスを常に確認する必要があります。use autodie

于 2010-09-15T16:16:30.490 に答える
0

log_file代わりにファイル名を渡すことでファイルハンドルを返す方が良いかもしれません。


期待するドキュメントから:

$object->log_file("filename" | $filehandle | \&coderef | undef)

セッションをファイルに記録します。生成されたプロセスとの間で送受信されるすべての文字がファイルに書き込まれます。通常はログファイルに追加しますが、「w」の追加モードを渡してファイルを切り捨てることができますopen():

$object->log_file("filename", "w");

ログファイルハンドルを返します。

したがって、次を使用して同じ機能を実現できるはずです。

my $sess = Expect->spawn("telnet $ip");
$sess->log_file($opt{l});               # Or my $fh = $sess->log_file...
                                        # if that filehandle is needed

これで、すべてのセッション アクティビティがファイルに記録されます。追加モードがデフォルトです。

于 2010-09-15T16:29:33.890 に答える