tjw*_*992 11 sorting perl scope
我理解如何使用Perl sort()函数得到我想要的结果,这更像是关于内部工作的问题sort().
"$ a"和"$ b"变量来自哪里?我阅读了文档中的排序,似乎不清楚.什么是"$ a"和"$ b"以及它们的特殊之处是什么?
例如:
my @sorted_list = sort {$a cmp $b} @unsorted_list;
Run Code Online (Sandbox Code Playgroud)
如何排序知道如何处理"$ a"和"$ b"以及为什么不为"$ a"或"$ b"获得"全局符号需要显式包名"错误?
cod*_*eim 19
$a并且$b是免除全局变量; 它们是免除的,因为Perl允许它们被使用(任何地方)而不被声明.它们由sort函数设置.在排序中使用任何其他未声明的全局(在严格模式下)将触发错误.
sort函数接受各种形式的输入,一个是代码块,它是你所指的形式.
{$a cmp $b}是一个代码块,它被解析并作为"的代码块"来排序函数传递和Perl检查参数为排序,如果它接收到一个代码块,排序将设置$a和$b,如果它们作为内包全局存在代码块,并分配要排序的每对项目$a和$b.您所要做的就是参考它们来控制排序算法.否则,使用内部算法(我认为是合并排序).
http://perldoc.perl.org/functions/sort.html
$a并且$b不是词法,它们是包全局变量(或者只是全局变量).
在一个主要你可以写:
sort {$main::a cmp $main::b} @list;
Run Code Online (Sandbox Code Playgroud)
或者在另一个包中,你可以写:
package foo;
sort {$foo::a cmp $foo::b} @list;
Run Code Online (Sandbox Code Playgroud)
你不应该像这样做前缀; 我正在演示这个$a并且$b实际上是你当前包中的全局变量,而不是$asort函数中的一些魔法,尽管Perl知道即使使用严格模式也允许你定义它们.
您不能只使用任何变量(在严格模式下).尝试:
sort {$A cmp $B} @list;
Global symbol "$A" requires explicit package name at sort.pl
Run Code Online (Sandbox Code Playgroud)
你不能在排序范围内使用词法(我的$ a).
my $a;
sort {$a cmp $b} @list;
Can't use "my $a" in sort comparison at sort.pl line 13.
Run Code Online (Sandbox Code Playgroud)
$a并且在Perl的任何地方$b都很特别.他们免于严格模式,这与排序无关,尽管是免除的原因.sort
Perl的"sort()"函数的[比较代码]中究竟是什么"$ a"和"$ b"?
要排序的值列表中的两个值.该块将返回关于如何在最终结果中将其定位到另一个的信息.
什么是"$ a"和"$ b"以及它们的特殊之处是什么?
包变量,并没有什么特别的,除了use strict 'vars';不考虑使用它们是一个错误.
"$ a"和"$ b"变量来自哪里?
他们居住在sort.
怎么排序知道如何处理"$ a"和"$ b"
除了根据需要填充它们以执行其功能之外,它不会对它们执行任何操作.
为什么不为"$ a"或"$ b"获得"全局符号需要显式包名"错误?
这将使它们很难使用它们!
如果您定义一个局部变量,
my $a或者my $b然后尝试sort在这些[词法]变量可见的范围内使用,会发生什么?
如果比较函数在a my $a和/或的范围内my $b,它将使用那些变量而不是包变量sort填充.
Perl意识到你可能很容易犯错,所以它会检查它.
$ perl -c -e'sort { my ($a,$b); $a cmp $b } @a;'
Can't use "my $a" in sort comparison at -e line 1.
Run Code Online (Sandbox Code Playgroud)