Почему мой благословенный Perl дескриптор файла не возвращает true с `can ('print')` '? - PullRequest
5 голосов
/ 15 сентября 2010

По какой-то причине я не могу заставить файловые дескрипторы работать с методом Expect.pm log_file. Первоначально я получил справку по Как передать файловый дескриптор в функцию log_file в Perl Expect? , где было предложено использовать файловый дескриптор IO :: Handle для перехода к методу. Кажется, это другая проблема, поэтому я решил начать новый вопрос.

Это оскорбительный раздел Expect.pm:

.
if (ref($file) ne 'CODE') {
  croak "Given logfile doesn't have a 'print' method"
    if not $fh->can("print");
  $fh->autoflush(1);        # so logfile is up to date
}

Итак, я попробовал этот пример кода:

use IO::Handle;
open $fh, ">>", "file.out" or die "Can't open file";
$fh->print("Hello, world");
if ($fh->can("print"))
{
  print "Yes\n";
}
else
{
  print "No\n";
}

Когда я запускаю это, я получаю два (на мой взгляд) конфликтующих предмета. Файл с одной строкой с надписью «Hello, world» и выводом «No». На мой взгляд, строка $fh->can должна вернуть true. Я здесь не прав?

Ответы [ 2 ]

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

Странно, похоже, вам нужно создать реальный IO::File объект, чтобы метод can заработал.Попробуйте

use IO::File;

my $fh = IO::File->new("file.out", ">>")
    or die "Couldn't open file: $!";
2 голосов
/ 15 сентября 2010

IO::Handle не перегружает функцию open(), поэтому вы на самом деле не получаете объект IO::Handle в $fh.Я не знаю, почему работает строка $fh->print("Hello, world") (возможно, потому что вы вызываете функцию print(), а когда вы делаете такие вещи, как $foo->function, это эквивалентно function $foo, так что вы по сути печатаете в дескриптор файлакак вы обычно ожидаете).

Если вы измените свой код на что-то вроде:

use strict;
use IO::Handle;
open my $fh, ">>", "file.out" or die "Can't open file";
my $iofh = new IO::Handle;
$iofh->fdopen( $fh, "w" );
$iofh->print("Hello, world");
if ($iofh->can("print"))
{
  print "Yes\n";
}
else
{
  print "No\n";
}

... тогда ваш код будет работать так, как вы ожидаете.По крайней мере, это для меня!

...