perl - 带括号和不带括号的eof之间的区别? (Perl5)

标签 perl

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

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

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

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

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

我的问题是:如何 eof 知道调用它时使用或不使用 (),然后该怎么办?该函数是否以某种方式进行了特殊处理,或者任何函数都可以确定它是在调用时带括号还是不带括号?

最佳答案

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


就像+and一样,在perlfunc中起作用是运营商

The functions in this section can serve as terms in an expression. They fall into two major categories: list operators and named unary operators.

作为运算符,他们可以提供他们喜欢的任何语法。

原型(prototype)可用于复制某些函数的语法。您可以使用 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]"'
*;$@

关于perl - 带括号和不带括号的eof之间的区别? (Perl5),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66929908/

相关文章:

regex - 继续在 perl 中换行

regex - 从命令行,仅在另一个正则表达式匹配后才进行 perl 替换匹配

perl - 相当于 perl 中的键集

regex - 如何使用正则表达式来验证 iSCSI 目标名称?

regex - Perl 正则表达式命令行问题

ruby - Tcl 是否具有 PE​​RL 和 Ruby backtic 的等价物

Perl 将二进制流转换为十六进制

html - XPath 收集多个属性(html 事件)

正则表达式匹配多个字符串但不匹配特定字符串

perl - 如何为具有不同数量值的 DBI 插入编写子例程?