1

我知道我可以轻松地做类似的事情

sub sin {
    sin($_[0]);
}

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

{$foo}(123);

对比

&{$foo}(123);

这有效,但不适用于核心功能。

谢谢。

4

3 回答 3

6

AFAIK不,你不能这样做。出于性能原因,CORE函数从不查看符号表,除非CORE::GLOBAL在编译时声明了等效函数。不幸的是,您必须编写该CORE::GLOBAL函数并使其恰到好处地模拟真实函数的调用约定。例如,如果没有大量黑客攻击,某些CORE功能就无法完全复制。由于全局变量会影响您的所有代码和所有库代码,因此您必须确保它完全正确,否则会导致非常难以调试的错误。一些模块,例如autodie,必须不遗余力地围绕核心功能。printopenCORE::GLOBAL

但是在这里,让我告诉你枪支储物柜和弹药在哪里......

my @return = eval "$function(\@args)";

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

于 2010-05-31T21:14:09.443 回答
2

如果我正确阅读了这个 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);
于 2010-05-31T14:33:54.920 回答
0

看起来你需要在编译时覆盖核心函数,然后你可以摆弄它们。不过,我更喜欢调度散列(或标量)方法。

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";
于 2010-06-01T06:56:34.147 回答