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

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

并象征意义地指出,对于我需要Symb Ref的每个功能,但我想知道是否有一种方法可以做类似

{$foo}(123);

VS.

&{$foo}(123);

哪个有效,但不适合核心功能。

谢谢。

有帮助吗?

解决方案

Afaik不,您不能做到。出于绩效原因, CORE 除非等效,否则函数永远不会看符号表 CORE::GLOBAL 功能已在编译时声明。不幸的是,你必须写 CORE::GLOBAL 功能并使其正确模拟真实功能的调用约定。一些 CORE 如果没有大规模黑客,功能就无法完全复制 printopen 例如。自从 CORE::GLOBAL 是全局效果您的所有代码和所有库代码,您必须确保获得它 确切地 对或很难调试错误。一些模块,例如 Autodie, ,必须竭尽全力围绕核心功能。

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

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

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

其他提示

如果我读书 这个问题 正确地,您不能参考内置功能。我怀疑类似的困难会阻止您使用符号参考来调用内置。

关于使用符号引用来调用代码,我建议您改用调度表。例如:

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";
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top