微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Perl变量范围问题

所以我有一个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 "@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寻找它们的地方.它创建的全局变量只有在调用该子时才存在.

请注意,您将获得一个“仅使用一次”的警告名称;不管怎么说,我确信你可以通过一些箍来避免这种情况.

原文地址:https://www.jb51.cc/Perl/171997.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐