3

我有一个带有返回文件句柄的方法的对象,我想从该句柄中读取。以下不起作用,因为方法调用的右尖括号被解释为输入阅读器的右尖括号:

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

这被解析为:

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

这显然是一个语法错误。有什么方法可以在角度运算符中执行方法调用,还是需要像这样将其分成两个步骤?

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

4 回答 4

7

您可以考虑使用拼写代替,这样可以通过使用良好的常规语法而不是特殊情况来避免该问题。或者您可以将其分配给标量。你的选择。<...>readline(...)

于 2010-04-20T03:01:42.113 回答
3

你必须打破它;<> 操作符需要像 <STDIN> 这样的 typeglob,一个简单的标量变量,其中包含对文件句柄或 typeglob 的引用,如 <$fh>,或 glob() 函数的参数,如 <*.c>。在您的示例中,您实际上是在调用 glob('$object-')。

<> 实际上被解释为对 readline() 的调用,所以如果你真的想要你可以说my $input = readline( $object->get_handle() );我不确定这是否更干净,特别是如果你要多次从句柄中读取。

有关详细信息,请参阅http://perldoc.perl.org/perlop.html#I%2fO-Operators

于 2010-04-20T03:00:55.407 回答
1
my $input = readline($object->get_handle());

或者

use IO::Handle;

my $input = $object->get_handle()->getline();
于 2012-01-24T21:21:16.377 回答
0

您将无法在<...>此处使用运算符来读取文件句柄,因为任何比<bareword>or更复杂的东西都<$scalar>被解释为glob(...)调用,因此通常的消歧技巧在这里都不起作用。运算符是的<HANDLE>语法糖readline HANDLE,所以你可以这样写:

my $input = readline $object->get_handle;

但是,如果您将在循环中执行此操作,则将句柄缓存在标量中会更有效。然后<...>操作员将按您的预期工作:

my $handle = $object->get_handle;
while (my $input = <$handle>) {
    ...
}
于 2010-04-20T02:49:11.630 回答