我试图自己找到错误,但没有看到它。以下代码会产生警告(Perl 5.18.2 和 5.32.1 中存在同样的问题)。
Use of uninitialized value in numeric comparison (<=>) at test.pl line 14.
Run Code Online (Sandbox Code Playgroud)
当执行 的比较功能时sort(因此,sort操作无法正确执行)。据我所知,哈希值没有初始值,它们都有定义的数值。
Use of uninitialized value in numeric comparison (<=>) at test.pl line 14.
Run Code Online (Sandbox Code Playgroud)
备注:在使用语句递增哈希元素创建行之前,它没有帮助添加哈希元素创建行$count{$x}++;- 相同的结果(预期,undef对于递增操作,计数类似于 0):
...
$count{$x} = 0 unless defined $count{$x};
$count{$x}++;
...
Run Code Online (Sandbox Code Playgroud)
通常,该函数使用两个名为和sort的包变量来进行排序。具体来说,将当前包上调用的变量和设置为当前排序值。这些并不是你的阻碍的论据;而是你的观点。它们是当前包中的全局变量。$a$bsort$a$b{ $count{$b} <=> $count{$a} }
现在,$b好了。由于您从未用它做任何其他事情,Perl 就可以很好地选择包变量。但是您在代码的前面声明了一个my调用的词法 ( ) 变量,并且该词法正在隐藏包变量。$a
sort设置一个名为 的变量实际上也是如此$YourPackage::a,并且您的代码正在访问一个名为 的局部变量my $a,该变量与另一个变量无关。
您可以通过将my $a = join '',@words;变量更改为其他名称来解决此问题,事实上您应该这样做。由于历史原因,名称$a、$b、 和$_在 Perl 中不加区别地用于类似的事情,因此最好永远不要将您自己的变量命名为任何这些名称。
但是,如果您不想(或不能)更改任何其余代码,则可以使用our.
for my $x (sort { our $a; $count{$b} <=> $count{$a} } keys %count) {
...
}
Run Code Online (Sandbox Code Playgroud)