gpt4 book ai didi

Perl 变量范围问题

转载 作者:行者123 更新时间:2023-12-04 10:22:15 24 4
gpt4 key购买 nike

所以我有一个 Perl 类。它有一个 sort()方法,我希望它与内置的 sort() 或多或少相同功能:

$object->sort(sub ($$) { $_[0] <=> $_[1] });

但我不能这样做:
$object->sort(sub { $a <=> $b });

因为范围。但是 List::Util 模块使用 reduce() .我查看了 List::Util 模块,他们用 no strict 'vars' 做了一些相当讨厌的事情。实现这一目标。我试过了,但没有用。

据我了解 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 将要寻找它们的地方。它正在创建仅在调用该 sub 时才存在的全局变量。

请注意,您将获得一个带有 warnings 的“名称仅使用一次”。 ;我敢肯定,不知何故,您可以跳过一些障碍来避免这种情况。

关于Perl 变量范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1325380/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com