perl - 带括号和不带括号的eof的区别?(Perl5)
问题描述
我正在尝试制作一个 perl 单线模仿 awk 的文件相关行号计数器“FNR”。这本身不是问题。在一次尝试中,我使用了以下命令:
perl -lnE 'say "$. : $_"; $.=0 if eof' testfiles
这有效:(自动递增的)跨文件行计数器$.
在到达每个测试文件的最后一行时被重置。当我在eof
函数调用中添加括号时,如下所示:
perl -lnE 'say "$. : $_"; $.=0 if eof()' testfiles
该程序不再按预期工作,因为eof()
仅在处理最后一个测试文件的最后一行时才返回 true。这在此处正确记录。
我的问题是:如何eof
知道是否使用或不调用它,()
因此该怎么做?该函数是否有某种特殊情况,或者任何函数都可以找出它是带括号还是不带括号调用的?
解决方案
这是一个运算符,其语义无法被 subs 复制。
就像+
and一样, perlfunc中的and
函数也是运算符。
本节中的函数可以用作表达式中的项。它们分为两大类:列表运算符和命名一元运算符。
作为操作员,他们可以提供他们喜欢的任何语法。
原型可用于复制某些函数的语法。您可以使用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
的语法被误报为能够被复制。
$ perl -M5.010 -e'say prototype("CORE::open") // "[undef]"'
*;$@