Как я могу передать дескриптор файла в функцию log_file в Perl Expect? - PullRequest
0 голосов
/ 15 сентября 2010

Я чувствую себя глупо, спрашивая об этом, но я попробовал пару вещей, и я не уверен, куда идти с этим.

Из документации Expect.pm :

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

Запись сеанса в файл. Все символы отправлены или получены от порожденный процесс записывается в файл.

Я бы хотел передать дескриптор файла $ в файл_файла. Однако, когда я попробовал это:

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 ]

4 голосов
/ 15 сентября 2010

Если у вас есть дескриптор файла голого слова с именем LOG, вы можете передать его функции, сказав \*LOG (вы можете прочитать об этом в perldoc perldata), но не делайте этоготот.Файловые дескрипторы Bareword очень старый стиль и больше не должны использоваться.Попробуйте использовать лексический дескриптор файла и версию open с тремя аргументами:

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

вы можете использовать $log везде, где вы использовали LOG в прошлом.

Вы также должны использоватьstrict и warnings прагм.

1 голос
/ 15 сентября 2010

Попробуйте использовать лексический файловый дескриптор (и трех аргумент 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 голосов
/ 15 сентября 2010

Может быть, лучше вернуть дескриптор файла, используя 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

Теперь все ваши сеансы будут записываться в файл. Режим добавления по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...