2010-04-20 3 views
3

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

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

Это получает разобранную как:

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

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

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

Может быть, лучшим решением является 'использовать IO :: File', а затем лечить ручки как объекты? –

+3

'readline' - лучшее решение поставленного вопроса, но я решил использовать OO для своего ввода-вывода. 'использовать IO :: File'. Поэтому мой реальный ответ - $ object-> get_handle-> getline'. –

ответ

3

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

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

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

0

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

my $input = readline $object->get_handle; 

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

my $handle = $object->get_handle; 
while (my $input = <$handle>) { 
    ... 
} 
+0

Я бы предпочел не использовать косвенный синтаксис объекта. Это хрупкое. Я должен был бы сделать так, чтобы никогда не позволял моему коду приближаться к подпрограмме 'get_handle'. –

+0

@ Ryan: Если вас не волнует эта проблема с чисто академической точки зрения, я бы пошел с двумя решениями, которые вы предоставили в вопросе. Синтаксически, однако, похоже, что решение Эрика может работать. Это выглядело бы красиво в поэзии Перла. – Ether

+1

'readline FILE' - это то же самое, что и' ', так что это будет нормально работать. –

7

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

+0

Да, мое текущее решение - 'readline'. –

1
my $input = readline($object->get_handle()); 

или

use IO::Handle; 

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