【问题标题】:Difference between eof with and without parentheses? (Perl5)带括号和不带括号的eof的区别? (Perl5)
【发布时间】:2021-06-29 22:48:59
【问题描述】:

我正在尝试使 perl 单行模仿 awk 的文件相对行号计数器“FNR”。这本身不是问题。在一次尝试中,我使用了以下命令:

perl -lnE 'say "$. : $_"; $.=0 if eof' testfiles

这有效:(自动递增的)跨文件行计数器$. 在到达每个测试文件的最后一行时被重置。当我在eof 函数调用中添加括号时,如下所示:

perl -lnE 'say "$. : $_"; $.=0 if eof()' testfiles

程序不再按预期工作,因为eof() 仅在处理最后一个测试文件的最后一行时返回 true。这是正确记录的here

我的问题是:如何eof 知道它是否在有或没有() 的情况下被调用,因此该怎么办?该函数是否有某种特殊情况,或者任何函数都可以找出是否带括号或不带括号调用它?

【问题讨论】:

    标签: perl


    【解决方案1】:

    这是一个运算符,其语义无法被 subs 复制。


    就像+and 一样,perlfunc 中的函数是运算符

    本节中的函数可以用作表达式中的术语。它们分为两大类:列表运算符和命名一元运算符。

    作为操作员,他们可以提供任何他们喜欢的语法。

    原型可用于复制某些函数的语法。您可以使用prototype("CORE::funcname") 来确定哪个。

    $ perl -M5.010 -e'say prototype("CORE::length") // "[undef]"'
    _
    
    $ perl -M5.010 -e'say prototype("CORE::sysread") // "[undef]"'
    *\$$;$
    
    $ perl -M5.010 -e'say prototype("CORE::say") // "[undef]"'
    [undef]
    

    从技术上讲,eof 的语法可以被 subs 复制。所以prototype 确实返回了eof 的值。

    $ perl -M5.010 -e'say prototype("CORE::eof") // "[undef]"'
    ;*
    

    但是,它的语义无法复制。没有办法让 sub 判断它是否在有或没有括号的情况下被调用。好吧,也许可以使用 Devel::CallParser 或关键字插件,但这需要 C 代码,需要大量工作,而且它们也有自己的问题。


    附带说明,open 的语法是 misreported,因为可以被复制。

    $ perl -M5.010 -e'say prototype("CORE::open") // "[undef]"'
    *;$@
    

    【讨论】:

      【解决方案2】:

      内置的一元函数在解析器中是特殊的。没有 perl 级别的方法可以对子例程调用执行相同的操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-27
        • 1970-01-01
        • 2020-04-17
        • 1970-01-01
        • 2015-05-08
        • 2015-08-25
        相关资源
        最近更新 更多