大佬教程收集整理的这篇文章主要介绍了Perl变量范围问题,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
$object->sort(sub ($$) { $_[0] <=> $_[1] });
但我做不到:
$object->sort(sub { $a <=> $b });
因为范围.但List :: Util模块使用reduce()执行此操作.我查看了List :: Util模块,他们做了一些相当讨厌的事情,没有严格的“变量”来实现这一点.我试过了,但无济于事.
我的理解是reduce()按照它的方式工作,因为它被导出到适当的命名空间,因此我的类不能这样做,因为该函数在另一个命名空间中非常牢固.这是正确的,还是有一些(无疑是更可怕和不明智的)方式在我的情况下这样做?
package Foo; use Strict; use warnings; sub sort { my ($self,$sub) = @_; my ($pkg) = caller; my @x = qw(1 6 39 2 5); print "@x\n"; { no Strict 'refs'; @x = sort { local (${$pkg.'::a'},${$pkg.'::b'}) = ($a,$b); $sub->(); } @x; } print "@x\n"; return; } package main; use Strict; use warnings; my $foo = {}; bless $foo,'Foo'; $foo->sort(sub { $a <=> $b }); # 1 6 39 2 5 # 1 2 5 6 39
据推测,你会对一些实际上属于对象的数据进行排序.
你需要caller
魔法,所以你在调用者的包中本地化$a和$b,这是Perl寻找它们的地方.它创建的全局变量只有在调用该子时才存在.
请注意,您将获得一个“仅使用一次”的警告名称;不管怎么说,我确信你可以通过一些箍来避免这种情况.
以上是大佬教程为你收集整理的Perl变量范围问题全部内容,希望文章能够帮你解决Perl变量范围问题所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。