如何读取在Perl中返回文件句柄的方法?

如何读取在Perl中返回文件句柄的方法?,perl,syntax,filehandle,Perl,Syntax,Filehandle,我有一个对象,其方法返回一个filehandle,我想从该句柄读取。以下操作不起作用,因为方法调用的直角括号被解释为输入读取器的闭合角括号: my $input = <$object->get_handle()>; my$input=get_handle()>; 将其解析为: my $input = ( < $object- > ) get_handle() >; my$input=()get_handle()>; 这显然是一个语法错误。是否有任何方法

我有一个对象,其方法返回一个filehandle,我想从该句柄读取。以下操作不起作用,因为方法调用的直角括号被解释为输入读取器的闭合角括号:

my $input = <$object->get_handle()>;
my$input=get_handle()>;
将其解析为:

my $input = ( < $object- > ) get_handle() >;
my$input=(<$object->)get_handle()>;
这显然是一个语法错误。是否有任何方法可以在angle操作符中执行方法调用,或者我需要将其分为两个步骤

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

您将无法使用此处的
运算符读取文件句柄,因为任何比
更复杂的操作都被解释为
全局(…)
调用,因此通常的消歧技巧在此处都不起作用。
运算符是
读线句柄的语法糖,因此可以这样编写:

my $input = readline $object->get_handle;
但是,如果在循环中执行此操作,则将句柄缓存在标量中将更加高效。然后,
操作员将按照您的预期工作:

my $handle = $object->get_handle;
while (my $input = <$handle>) {
    ...
}
my$handle=$object->get\u handle;
while(my$input=){
...
}

你必须打破它;运算符需要一个typeglob-like、一个包含对filehandle或typeglob-like的引用的简单标量变量,或一个glob()函数的参数like。在您的示例中,您实际上调用了glob(“$object-”)

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


有关详细信息,请参阅

> p>可以考虑拼写<代码> <代码>为<代码>读行(< /代码>强> <代码>…<代码> <强> >代码> <代码>,通过使用良好的正则语法来避免问题而不是特殊情况。或者您可以将其分配给标量。你的选择

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


我不喜欢使用间接对象语法。它易碎。我必须承诺绝不允许我的代码接近
get\u handle
子例程。@Ryan:如果你不从纯学术的角度考虑这个问题,我会使用你在问题中提供的两种语句解决方案。然而,从语法上看,Eric的解决方案似乎可行。在Perl诗歌中,它看起来会很好。
读线文件
完全相同,所以这会很好。也许最好的解决方案是
使用IO::FILE
,然后将句柄视为对象?
读线
是解决上述问题的最佳方案,但我决定从现在开始在IO中使用OO<代码>使用IO::文件
。所以我真正的答案是
$object->get\u handle->getline
use IO::Handle;

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