Perl变量范围问题
发布时间:2020-12-15 21:54:16 所属栏目:大数据 来源:网络整理
导读:所以我有一个Perl课程.它有一个sort()方法,我希望它与内置的sort()函数或多或少相同: $object-sort(sub ($$) { $_[0] = $_[1] }); 但我做不到: $object-sort(sub { $a = $b }); 因为范围.但List :: Util模块使用reduce()执行此操作.我查看了List :: Util模
所以我有一个Perl课程.它有一个sort()方法,我希望它与内置的sort()函数或多或少相同:
$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 "@xn"; { no strict 'refs'; @x = sort { local (${$pkg.'::a'},${$pkg.'::b'}) = ($a,$b); $sub->(); } @x; } print "@xn"; 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 据推测,你会对一些实际上属于对象的数据进行排序. 你需要 请注意,您将获得一个“仅使用一次”的警告名称;不管怎么说,我确信你可以通过一些箍来避免这种情况. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |