gpt4 book ai didi

perl - Perl 的 "$a"函数中的 "$b"和 "sort()"到底是什么?

转载 作者:行者123 更新时间:2023-12-04 01:33:30 29 4
gpt4 key购买 nike

我了解如何使用 Perl 的 sort() 获得我想要的结果功能,这更多是关于sort()的内部运作的问题.

“$a”和“$b”变量从何而来?我通读了排序文档,但似乎不清楚。什么是“$a”和“$b”,它们的特别之处是什么?

前任:

my @sorted_list = sort {$a cmp $b} @unsorted_list;

sort 是如何知道如何处理“$a”和“$b”的,为什么您没有得到“$a”或“$b”的“全局符号需要显式包名”错误?

最佳答案

$a$b是豁免的全局变量;它们是豁免的,因为 Perl 允许在不被声明的情况下(在任何地方)使用它们。它们由排序功能设置。在排序中使用任何其他未声明的全局(在严格模式下)将触发错误。

sort 函数接受各种形式的输入,一种是代码块,也就是您所指的形式。
{$a cmp $b}是一个代码块,它被解析并作为“代码块”传递给 sort 函数,Perl 检查 sort 的参数,如果它收到一个代码块,sort 将设置 $a$b ,如果它们在代码块中作为包全局变量存在,则将每对正在排序的项目分配给 $a$b .您所要做的就是引用它们来控制排序算法。否则,使用内部算法(我认为是归并排序)。

http://perldoc.perl.org/functions/sort.html
$a$b不是词法,它们是包全局变量(或只是全局变量)。

在一个主要的,你可以写:

sort {$main::a cmp $main::b} @list;

或者在另一个包中,你可以写:
package foo;

sort {$foo::a cmp $foo::b} @list;

你实际上不应该像这样前缀;我正在证明 $a$b实际上是你当前包中的全局变量,而不是魔法 $a在 sort 函数中,尽管 Perl 知道即使在严格模式下也允许您定义它们。

您不能只使用任何变量(在严格模式下)。尝试:
sort {$A cmp $B} @list;

Global symbol "$A" requires explicit package name at sort.pl

您不能在排序范围内使用词法(my $a)。
my $a;
sort {$a cmp $b} @list;

Can't use "my $a" in sort comparison at sort.pl line 13.
$a$b在 Perl 的任何地方都很特别。它们不受严格模式的限制,这与排序无关,尽管 sort是豁免的原因。

关于perl - Perl 的 "$a"函数中的 "$b"和 "sort()"到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26127617/

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