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,您可以通过说\*LOG(您可以在 中阅读有关此内容的更多信息perldoc perldata)将其传递给函数,但不要这样做。裸字文件句柄是一种非常古老的风格,不应再使用。尝试使用词法文件句柄和 open 的三个参数版本:

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

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

您还应该使用strictandwarnings编译指示。

于 2010-09-15T16:15:26.747 回答
1

尝试使用词法文件句柄(和三个参数open, and die)开始:

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

LOG非常通用,可能会在代码中的某个地方被另一个文件句柄打败(或做王牌)。使用词法文件句柄有助于防止混淆。并且您应该始终检查open()(or 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 回答