0


0

Perl Expectのlog_file関数にファイルハンドルを渡すにはどうすればよいですか?

私はこれを尋ねるのは愚かだと感じますが、私はいくつかのことを試しましたが、どこに行くべきかわかりません。

_ _ $ 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`に送信する行のみが含まれています。

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

3 Answer


4


「LOG」という名前のベアワードファイルハンドルがある場合は、「\ * LOG」と言って関数に渡すことができます(これについては、http://perldoc.perl.org/perldata.html#Typeglobs-and -Filehandles [perldoc perldata])、しかしそれはしないでください。 ベアワードファイルハンドルは非常に古いスタイルであるため、使用しないでください。 字句ファイルハンドルとopenの3つの引数バージョンを使用してみてください。

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

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

また、http://perldoc.perl.org/strict.html [strict]およびhttp://perldoc.perl.org/warnings.html [` warnings`]プラグマも使用する必要があります。


1


語彙ファイルハンドル(および3つの引数 open`と die`)を使用して、次のことから始めてみてください。

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

「LOG」は非常に汎用的であり、コード内のどこかにある別のファイルハンドルに勝る(または勝つ)可能性があります。 字句ファイルハンドルを使用すると、混乱を防ぐことができます。 ファイルを実際に開けない場合に備えて、常に open()(または use autodie)の戻りステータスを確認する必要があります。


0


代わりにファイル名を渡すことで、 `log_file`を使用してファイルハンドルを返すことをお勧めします。

'' '' '

_ _ $ object→ log_file(" filename "| $ filehandle | \&coderef | undef)

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

$ object→ log_file(" filename "、" w ");

logfilehandle_を返します。 _ __

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

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

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