我对这个问题感到愚蠢,但我尝试了几件事,我不知道该去哪里。
$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
的行。
我不确定文件处理功能是否在函数中使用,或者我是否做错了。
答案 0 :(得分:4)
如果您有一个名为LOG
的裸字文件句柄,您可以通过说\*LOG
将其传递给函数(您可以在perldoc perldata
中详细了解此内容),但不要这样做那。 Bareword文件句柄是一种非常古老的风格,不应再使用。尝试使用词法文件句柄和open的三个参数版本:
open my $log, ">>", $opt{l}
or die "could not open $opt{l}: $!";
您可以在过去使用$log
的任何地方使用LOG
。
答案 1 :(得分:1)
尝试使用词法文件句柄(以及三个参数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
)的返回状态。
答案 2 :(得分: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
现在,您的所有会话活动都将记录到该文件中。附加模式是默认模式。