前几天我问了一个关于在Perl的sort()
函数中使用"$a"one_answers"$b"的问题:
"$a";以及"$b";在Perl';s";sort()";作用
我现在有一个后续问题。"$a"one_answers"$b"是否仅由sort()
使用,或者是否有其他Perl函数可以利用这些特殊的全局变量?
或者,即使没有其他函数使用它们,在sort()
之外,是否存在使用"$a"或"$b"的情况?
编辑:
澄清:
简而言之,问题是"$a"one_answers"$b"能被sort()
以外的东西使用吗?
我只是想看看它们还能在其他什么情况下使用。我从未见过"$a"或"$b"被其他任何东西使用,我想知道sort()
之外还有其他特殊用途。
"$a"one_answers"$b"能被
sort()
以外的其他东西使用吗
正如已经解释过的,$a
和$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.
其他非内置函数,如List::Util::reduce,也可以使用它们。
你能解释一下你为什么要问吗?我觉得你在寻找比这更重要的答案。
$a和$b是排序函数分配给它正在比较的两个元素的名称,它们是它分配给"compare()"用户提供的回调函数的参数。
您可以考虑在您设计的任何函数中使用"$a"、"$b"逻辑,将函数作为参数提供给该函数,并为该函数提供两个(或多个)参数。。。
希望我足够清楚。。。
简短的回答是"不,它们不是特别的,除非在sort
的上下文中"。然而,我最近确实有机会在sort
例程之外使用它们,这与您的问题有点密切关系。
我直接使用了$a
和$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
是像<=>
或cmp
这样的真正运算符一样),这就是促使我这样做的原因。这是我能想到使用$a
和$b
的唯一原因,除非它在sort
块或子例程中——事实上,它们在sort
的上下文中是特殊的,这意味着在上下文之外摆弄它们可能会让你痛苦。