3

前几天我问了一个关于在 Perl 的sort()函数中使用 "$a" 和 "$b" 的问题:

Perl 的“sort()”函数中的“$a”和“$b”到底是什么?

我现在有一个后续问题。"$a" 和 "$b" 是否仅由使用sort()这些特殊全局变量的 Perl 函数使用?

或者即使没有其他函数使用它们,是否还有其他情况sort()会使用“$a”或“$b”?

编辑:

澄清:

简而言之,问题是“$a”和“$b”可以被其他东西使用sort()吗?

我只是想知道它们可以在哪些其他情况下使用。我从未见过“$a”或“$b”被其他任何东西使用,并且想知道在sort().

4

4 回答 4

6

"$a" 和 "$b" 可以被其他东西使用sort()吗?

正如已经解释过的,$aand没有什么特别之处$b(除了它们是预先声明的)。问一个普通变量是否可以被一个函数以外的东西使用是没有意义的。这里$a被一些不是的东西使用sort

 $ perl -E'$a=123; say $a;'
 123

也就是说,这样做并不是一个好主意。最好使用词法变量,并且声明$a$b作为词法变量将使它们无法在sort(或在 List::Util 的函数中)使用而无需覆盖our ($a,$b);

$ perl -e'sub foo { my ($a) = @_; "..."; sort { $a cmp $b } @a; "..." }'
Can't use "my $a" in sort comparison at -e line 1.
于 2014-10-01T14:20:58.110 回答
2

其他非内置函数,例如 List::Util::reduce,也使用它们。

不过,你能解释一下你为什么要问吗?我觉得你正在寻找比这更大的东西作为答案。

于 2014-10-01T14:08:10.797 回答
1

$a 和 $b 是排序函数分配给它正在比较的两个元素的名称,它们是它分配给“compare()”用户提供的回调函数的参数。

您可以考虑在您设计的任何函数中使用“$a”、“$b”逻辑,向其提供函数作为参数,并为该函数提供两个(或更多)参数......

希望我足够清楚...

于 2014-10-01T14:07:15.423 回答
1

简短的回答是“不,它们并不特殊,除非在”的上下文中sort。但是,我最近确实有机会在例行程序之外使用它们sort,这与您的问题密切相关。

我使用$aand$b直接为了利用我的sort功能进行单一比较。我对它们进行了限定,local并使用了一个do块来包含范围:

my $cmp = do {
    local $a = $summary->{current_version};
    local $b = $latest_version_on_usb;
    cmp_version();
};

cmp_version是一个设计用于与 一起使用的子例程sort,因此,通常它的用法如下所示:

my @sorted_versions = sort cmp_version @old_versions;

因为cmp_version知道它将被 调用,所以它在内部和内部 sort完成所有工作。$a$b

我想在非排序上下文中重用我的排序子例程(我只想要一个“ $foo cmp_version $bar”比较的输出,就好像cmp_version是一个真正的运算符,比如<=>or cmp)是促使这一点的原因。这是我能想到使用的唯一原因$a$b除非它在sort块或子程序中——事实上它们在上下文中特殊的,这sort意味着在上下文之外与它们乱搞可能最终会咬你。

于 2017-02-06T17:50:50.527 回答