你能在Pe​​rl中引用内置函数吗?

Eri*_*rom 14 syntax perl

什么语法,如果有的话,能够引用内置的像shift

$shift_ref = $your_magic_syntax_here;
Run Code Online (Sandbox Code Playgroud)

您可以使用与用户定义的子相同的方式:

sub test { ... }

$test_ref = \&test;
Run Code Online (Sandbox Code Playgroud)

我尝试了以下,但都不起作用:

\&shift
\&CORE::shift
\&{'shift'}
\&{'CORE::shift'}
Run Code Online (Sandbox Code Playgroud)

如果需要,你的答案可以包括XS,但我不愿意.

澄清:我正在寻找一种通用解决方案,可以从任何内置程序获得功能齐全的代码参考.然后可以将此coderef传递给任何更高阶的函数,就像对用户定义的子的引用一样.到目前为止似乎是共识,这是不可能的,任何人都不同意?

yst*_*sth 5

不,你不能。您试图解决的根本问题是什么?可能有某种方法可以做到这一点。

关于问题的附加部分“如果需要,您的答案可以包括 XS,但我不希望这样做。”,从 XS 调用内置函数确实很困难,因为内置函数被设置为假设它们作为已编译的 optree 的一部分运行并设置一些全局变量。通常,调用内置函数本身使用的一些底层函数要容易得多,尽管并不总是有这样的函数,所以你会看到类似的东西:

buffer = sv_2mortal(newSVpvf("(caller(%d))[3]", (int) frame));
caller = eval_pv(SvPV_nolen(buffer), 1);
Run Code Online (Sandbox Code Playgroud)

(从 XS 执行字符串评估,而不是经历直接调用 pp_caller 所需的麻烦)。

  • 没有什么特别的问题,更多的是一个学术问题。@Telemachus => 为什么不呢?它将允许将内置函数传递给柯里化函数或任何其他高阶函数,而无需包装器来处理与内置函数原型的一致性,从而限制其功能 (4认同)