2010-04-20 54 views
3

我有一个返回文件句柄对象的方法,我想从手柄阅读。以下不起作用,因为该方法调用的直角支架被解释为输入读取器的闭合尖括号:我怎样才能从返回在Perl文件句柄的方法读?

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

也就是说被解析为:

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

这显然是一个语法错误。有没有什么办法可以执行的角度操作中的一个方法调用,或者我需要把它分成两个步骤,也是这样吗?

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

也许最好的解决办法是使用'IO :: File',然后把手柄的对象? – 2010-04-20 05:22:18

+3

'readline'是提出的问题的最佳解决方案,但我从现在开始决定使用OO作为我的IO。 '使用IO :: File'。因此,我真正的答案是'$对象 - > get_handle-> getline'。 – 2010-04-20 16:29:38

回答

3

你必须打破它;所述<>运营商期望像< STDIN一个类型团>,包含到一个文件句柄或类型团等< $跳频的基准的简单的标量变量>或类似<的* .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'子例程的地方。 – 2010-04-20 02:54:28

+0

@Ryan:如果你从纯粹的学术角度不关心这个问题,我会选择你在问题中提供的两个陈述解决方案。但是,从语法上看,Eric的解决方案看起来可以工作。它在Perl诗歌中看起来不错。 – Ether 2010-04-20 02:59:35

+1

'readline FILE'与''完全一样,所以这样可以正常工作。 – 2010-04-20 03:04:35

7

你可以考虑拼写<...>作为readline(...)代替,通过使用一个很好的常规语法,而不是一个特例可以避免这个问题。或者你可以将它分配给一个标量。你的选择。

+0

是的,我现在的解决方案是'readline'。 – 2010-04-20 03:16:21

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

use IO::Handle; 

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