我試圖自己找到錯誤,但沒有看到它。以下代碼會產生警告(Perl 5.18.2 和 5.32.1 中的同樣問題)。
Use of uninitialized value in numeric comparison (<=>) at test.pl line 14.
而執行 的比較功能sort(因此,sort操作未正確執行)。據我所知,哈希值沒有初始值,它們都有定義的數值。
use strict;
use warnings;
# Sort the occurrences of letters in a list of words, highest count first.
my @words = ('ACGT','CCGT','CATG'); # Just an example
my $a = join '',@words;
my $l = length $a;
my %count = ();
for (my $i = 0; $i < $l; $i ) {
my $x = substr( $a, $i, 1);
$count{$x} ;
}
for my $x (sort { $count{$b} <=> $count{$a} } keys %count) {
print "$x: $count{$x}\n";
}
備注:在使用陳述句遞增之前添加哈希元素創建行沒有幫助$count{$x} ;- 相同的結果(預期,undef遞增操作的計數為 0):
...
$count{$x} = 0 unless defined $count{$x};
$count{$x} ;
...
uj5u.com熱心網友回復:
通常,該sort函式使用兩個呼叫的包變數$a和$b進行排序。具體來說,將當前包上呼叫的變數設定為當前排序值sort。這些不是你的塊的論據;它們是當前包中的全域變數。$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) {
...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/453019.html
標籤:perl
