首页 > 解决方案 > 带括号和不带括号的eof的区别?(Perl5)

问题描述

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

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

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

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

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

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

标签: perl

解决方案


这是一个运算符,其语义无法被 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]"'
*;$@

推荐阅读