是否可以象征性地引用Perl核心模块?

Bla*_*oth 1 perl function symbolic-references perl-core

我知道我可以很容易地做类似的事情

sub sin {
    sin($_[0]);
}
Run Code Online (Sandbox Code Playgroud)

并象征性地引用我需要的每个函数,但我想知道是否有办法做类似的事情

{$foo}(123);
Run Code Online (Sandbox Code Playgroud)

&{$foo}(123);
Run Code Online (Sandbox Code Playgroud)

哪个有效,但不适用于核心功能.

谢谢.

Sch*_*ern 6

AFAIK没有,你不能这样做.出于性能原因,CORE函数永远不会查看符号表,除非CORE::GLOBAL在编译时声明了等效函数.不幸的是,你必须编写该CORE::GLOBAL函数并使其正确模拟真实函数的调用约定.有些CORE功能不能完全重现,而大规模的黑客,print以及open例如.由于CORE::GLOBAL全局影响您的所有代码和所有库代码,您必须确保它完全正确或导致非常难以调试错误.一些模块,如autodie,必须竭尽全力包装核心功能.

但是在这里,让我告诉你枪架和弹药的位置......

my @return = eval "$function(\@args)";
Run Code Online (Sandbox Code Playgroud)

......当然,这是一个巨大的安全性和可维护性漏洞.不要这样做.

  • 我希望接受这个答案并不意味着你真的会使用它. (6认同)