我知道我可以轻松地做类似的事情
sub sin {
sin($_[0]);
}
并象征性地为我需要符号引用的每个函数引用它,但我只想知道是否有办法做类似的事情
{$foo}(123);
对比
&{$foo}(123);
这有效,但不适用于核心功能。
谢谢。
我知道我可以轻松地做类似的事情
sub sin {
sin($_[0]);
}
并象征性地为我需要符号引用的每个函数引用它,但我只想知道是否有办法做类似的事情
{$foo}(123);
对比
&{$foo}(123);
这有效,但不适用于核心功能。
谢谢。
AFAIK不,你不能这样做。出于性能原因,CORE
函数从不查看符号表,除非CORE::GLOBAL
在编译时声明了等效函数。不幸的是,您必须编写该CORE::GLOBAL
函数并使其恰到好处地模拟真实函数的调用约定。例如,如果没有大量黑客攻击,某些CORE
功能就无法完全复制。由于全局变量会影响您的所有代码和所有库代码,因此您必须确保它完全正确,否则会导致非常难以调试的错误。一些模块,例如autodie,必须不遗余力地围绕核心功能。print
open
CORE::GLOBAL
但是在这里,让我告诉你枪支储物柜和弹药在哪里......
my @return = eval "$function(\@args)";
...当然,这是一个巨大的安全性和可维护性漏洞。不要这样做。
如果我正确阅读了这个 SO 问题,您将无法引用内置函数。我怀疑类似的困难会阻止您使用符号引用调用内置函数。
关于使用符号引用来调用代码,我建议您改用调度表。例如:
use strict;
use warnings;
sub sin_deg { sin $_[0] * atan2(1, 1) / 45 }
my %dt = (
sin_deg => \&sin_deg,
attack => sub { print "Attacking: @_\n" },
);
print $dt{sin_deg}->(60), "\n";
$dt{attack}->(1, 2, 3);
看起来你需要在编译时覆盖核心函数,然后你可以摆弄它们。不过,我更喜欢调度散列(或标量)方法。
use strict;
use warnings;
our $s;
BEGIN {
*CORE::GLOBAL::sin= sub { sin($_[0])*2 };
*CORE::GLOBAL::cos= sub { cos($_[0])*2 };
our $s= *CORE::GLOBAL::sin;
}
*CORE::GLOBAL::sin= *CORE::GLOBAL::cos;
print sin(0.01)."\n";
print $s->(0.01)."\n";