是否可以象征性地引用Perl Core模块?
-
05-10-2019 - |
题
我知道我可以轻松地做类似的事情
sub sin {
sin($_[0]);
}
并象征意义地指出,对于我需要Symb Ref的每个功能,但我想知道是否有一种方法可以做类似
{$foo}(123);
VS.
&{$foo}(123);
哪个有效,但不适合核心功能。
谢谢。
解决方案
Afaik不,您不能做到。出于绩效原因, CORE
除非等效,否则函数永远不会看符号表 CORE::GLOBAL
功能已在编译时声明。不幸的是,你必须写 CORE::GLOBAL
功能并使其正确模拟真实功能的调用约定。一些 CORE
如果没有大规模黑客,功能就无法完全复制 print
和 open
例如。自从 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";
不隶属于 StackOverflow