Как я могу прочитать из метода, который возвращает дескриптор файла в Perl? - PullRequest
3 голосов
/ 20 апреля 2010

У меня есть объект с методом, который возвращает дескриптор файла, и я хочу прочитать из этого дескриптора. Следующее не работает, потому что правая угловая скобка вызова метода интерпретируется как закрывающая угловая скобка считывателя ввода:

my $input = <$object->get_handle()>;

Это анализируется как:

my $input = ( < $object- > ) get_handle() >;

, что, очевидно, является синтаксической ошибкой. Можно ли каким-либо образом выполнить вызов метода в операторе угла или мне нужно разбить его на два шага, как это?

my $handle = $object->get_handle();
my $input = <$handle>;

Ответы [ 4 ]

7 голосов
/ 20 апреля 2010

Вместо этого можно рассмотреть написание <...> как readline(...), что позволяет избежать проблемы, используя хороший регулярный синтаксис вместо особого случая. Или вы можете просто назначить его на скаляр. Ваш выбор.

3 голосов
/ 20 апреля 2010

Вы должны разбить это; оператор <> ожидает typeglob типа , простую скалярную переменную, содержащую ссылку на дескриптор файла или typeglob типа <$ fh>, или аргумент для функции glob (), например <*. c>. В вашем примере вы на самом деле вызываете glob ('$ object-').

<> фактически интерпретируется как вызов readline (), поэтому, если вы действительно хотите, вы можете сказать my $input = readline( $object->get_handle() ); Я не уверен, что это чище, особенно если вы собираетесь читать из дескриптора больше, чем один раз.

Подробнее см. http://perldoc.perl.org/perlop.html#I%2fO-Operators.

1 голос
/ 25 января 2012
my $input = readline($object->get_handle());

или

use IO::Handle;

my $input = $object->get_handle()->getline();
0 голосов
/ 20 апреля 2010

Вы не сможете использовать оператор <...> здесь для чтения дескриптора файла, потому что что-либо более сложное, чем <bareword> или <$scalar>, интерпретируется как вызов glob(...), поэтому ни одно из обычных значений уловки будут работать здесь. Оператор <HANDLE> является синтаксическим сахаром для readline HANDLE, так что вы можете написать его так:

my $input = readline $object->get_handle;

Однако, если вы будете делать это в цикле, гораздо эффективнее будет кэшировать дескриптор в скаляре. Тогда оператор <...> будет работать так, как вы ожидаете:

my $handle = $object->get_handle;
while (my $input = <$handle>) {
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...