如何将文件句柄传递给Perl Expect的log_file函数?

时间:2010-09-15 16:03:07

标签: perl logging expect filehandle

我对这个问题感到愚蠢,但我尝试了几件事,我不知道该去哪里。

来自Expect.pm documentation

  

$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 个答案:

答案 0 :(得分:4)

如果您有一个名为LOG的裸字文件句柄,您可以通过说\*LOG将其传递给函数(您可以在perldoc perldata中详细了解此内容),但不要这样做那。 Bareword文件句柄是一种非常古老的风格,不应再使用。尝试使用词法文件句柄和open的三个参数版本:

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

您可以在过去使用$log的任何地方使用LOG

您还应该使用strictwarnings pragma。

答案 1 :(得分:1)

尝试使用词法文件句柄(以及三个参数opendie)开头:

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

LOG非常通用,可能会在代码中的某个地方被另一个文件句柄打败(或者做一个特朗普)。使用词法文件句柄有助于防止混淆。如果您无法真正打开文件,则应始终检查open()(或use autodie)的返回状态。

答案 2 :(得分:0)

使用log_file通过传递文件名来返回文件句柄可能更好。


来自Expect documentation

  

$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

现在,您的所有会话活动都将记录到该文件中。附加模式是默认模式。