【问题标题】:How can I read from a method that returns a filehandle in Perl?如何从 Perl 中返回文件句柄的方法中读取?
【发布时间】:2010-04-20 02:37:20
【问题描述】:

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

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

解析为:

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

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

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

【问题讨论】:

  • 或许最好的解决方案是use IO::File,然后把句柄当成对象?
  • readline 是对所提出问题的最佳解决方案,但我决定从现在开始对我的 IO 使用 OO。 use IO::File。所以我真正的答案是$object-&gt;get_handle-&gt;getline

标签: perl syntax filehandle


【解决方案1】:

您可以考虑将 &lt;...&gt; 拼写为 readline(...),这样可以避免使用 nice常规语法而不是特殊情况。或者您可以将其分配给标量。您的选择。

【讨论】:

    【解决方案2】:

    你必须打破它; 运算符需要一个类似于 的类型团,一个简单的标量变量,其中包含对文件句柄或类型团的引用,例如 ,或者一个用于 glob() 函数的参数,例如 。在您的示例中,您实际上是在调用 glob('$object-')。

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

    详情请参阅http://perldoc.perl.org/perlop.html#I%2fO-Operators

    【讨论】:

      【解决方案3】:
      my $input = readline($object->get_handle());
      

      use IO::Handle;
      
      my $input = $object->get_handle()->getline();
      

      【讨论】:

        【解决方案4】:

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

        my $input = readline $object->get_handle;
        

        但是,如果您将在循环中执行此操作,则将句柄缓存在标量中会更有效。然后&lt;...&gt; 运算符将按您的预期工作:

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

        【讨论】:

        • 我不想使用间接对象语法。很脆弱。我必须承诺绝不允许我的代码靠近get_handle 子例程。
        • @Ryan:如果您从纯粹的学术角度不关心这个问题,我会选择您在问题中提供的两个陈述解决方案。然而,从语法上看,Eric 的解决方案似乎可行。在 Perl 诗歌中看起来不错。
        • readline FILE&lt;FILE&gt; 完全相同,因此可以正常工作。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多