在 Perl 中,$a 和 $b 是兩個特殊的包變數,專門供 sort() 函數在比較區塊或比較函數中使用。根據 perldoc perlvar 的說明,這兩個變數因為這種特殊用途,即使啟用了 use strict 'vars',也不需要透過 use vars 或 our() 來宣告。
切勿使用 my $a 或 my $b 將它們詞法化(lexicalize),否則將無法在 sort() 的比較區塊或函數中正常使用它們。它們必須保持為包變數(全域變數)才能被排序機制正確存取。
#!/usr/bin/perl
use strict;
use warnings;
sub test {
$a = 1;
$b = 2;
print $a, "\n";
print $b, "\n";
}
test();
1;
即使開啟 strict 和 warnings,上述程式碼也不會產生錯誤或警告,這正是因為 $a 和 $b 享有特殊豁免權。但在實際撰寫排序邏輯時,務必直接使用 $a、$b 作為比較的兩個元素,例如:
my @sorted = sort { $a <=> $b } @numbers; # 數值升序
my @sorted = sort { $b cmp $a } @strings; # 字串降序
理解這一機制,能避免在使用 strict 時誤以為需要宣告而導致排序失效的常見錯誤。