我了解如何使用Perl的sort()函数来获取我想要的结果,这更多的是关于sort()的内部运算的问题.
“$a”和“$b”变量来自哪里?我阅读了关于排序的文件,似乎不清楚.什么是“$a”和“$b”,什么使他们特别?
例如:
my @sorted_list = sort {$a cmp $b} @unsorted_list;
解决方法
$a和$b是免除全局变量;它们是免除的,因为Perl允许它们被使用(任何地方)而不被声明.它们由排序函数设置.在排序(严格模式)中使用任何其他未声明的全局将触发错误.
排序函数接受各种形式的输入,一个是代码块,这是您所指的形式.
{$a cmp $b}是一个代码块,它被解析并作为“块代码”传递给排序函数,Perl检查参数进行排序,如果它接收到代码块,sort将设置$a和$b,如果它们作为代码块中的包全局变量存在,并且将分配给$a和$b的每对项目分配.所有你需要做的是指他们来控制排序算法.否则,使用内部算法(我认为是合并排序).
http://perldoc.perl.org/functions/sort.html
主要可以写:
sort {$main::a cmp $main::b} @list;
或者在另一个包中,你可以写:
package foo; sort {$foo::a cmp $foo::b} @list;
你不应该这样实际前缀我正在演示$a和$b实际上是您当前包中的全局变量,而不是一些魔术$a在排序函数中,尽管Perl知道允许您使用严格模式来定义它们.
您不能只使用任何变量(严格模式).尝试:
sort {$A cmp $B} @list; Global symbol "$A" requires explicit package name at sort.pl
您不能在排序范围内使用词汇(我的$a).
my $a; sort {$a cmp $b} @list; Can't use "my $a" in sort comparison at sort.pl line 13.
Perl中的$a和$b是特殊的.他们是免除严格的模式,这是无关的排序,虽然排序是免除的原因.