大佬教程收集整理的这篇文章主要介绍了在Perl中,确定coderef包的最可靠方法是什么?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
sub reduce (&@) { my $code = shift; my $caller = caller; my ($ca,$cb) = do { no Strict 'refs'; map \*{$caller.'::'.$_} => qw(a b) }; local (*a,*b) = local (*$ca,*$cb); $a = shift; while (@_) { $b = shift; $a = $code->() } $a }
最初,这种技术工作正常,但是一旦我尝试在高阶函数周围编写一个包装函数,找出正确的调用者就变得复杂了.
sub reduce_ref (&$) {&reduce($_[0],@{$_[1]})}
现在为了减少工作,我需要一些像:
@H_518_2@my ($ca,$cb) = do { my $caller = 0; $caller++ while caller($caller) =~ /^This::Package/; no Strict 'refs'; map \*{Caller($caller).'::'.$_} => qw(a b) };在这一点上,它成为一个跳过的包的问题,结合从不使用这些包中的功能的纪律.必须有一个更好的方法.
事实证明,高阶函数作为参数的子例程包含足够的元数据来解决问题.我目前的解决方案是使用B内省模块来确定传入子程序的编译存储空间.这样,无论代码编译和执行之间发生什么,高阶函数总是知道正确的包进行本地化.
@H_518_2@my ($ca,$cb) = do { require B; my $caller = B::svref_2object($codE)->STASH->NAME; no Strict 'refs'; map \*{$caller.'::'.$_} => qw(a b) };所以我的最终问题是,这是否是在这种情况下确定主叫方的最佳方法?还有其他一些我没想到的方法吗?目前的解决方案是否有等待发生的BUG?
sub reduce_ref (&$) { @_ = ( $_[0],@{$_[1]} ); goto &reduce; }
但一般来说,以下确实是你想要的:
B::svref_2object($codE)->STASH->NAME
你想要$a和$b变量的子的__PACKAGE__,所以你想知道该子的__PACKAGE__,这正是返回的.它甚至修复了以下内容:
{ package Utils; sub mk_some_reducer { ... return sub { ... $a ... $b ... }; } } reduce(mk_some_reducer(...),...)
它不会修复所有内容,但是如果不使用参数而不是使用$a和$b,这是不可能的.
以上是大佬教程为你收集整理的在Perl中,确定coderef包的最可靠方法是什么?全部内容,希望文章能够帮你解决在Perl中,确定coderef包的最可靠方法是什么?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。