這些都是我所知道的:什麼樣的Perl代碼可能導致未定義的行爲?
- 與語句修改有條件的或循環結構(如「
my $x if ...
」)修改了「my
」語句的行爲。 - 在標量上下文
truncate()
,當長度比文件- 使用32位整數的長度大在同一語句修改變量兩次,像
$i = $i++;
sort()
「1 << 32
」未定義。由負數位移位也是未定義的。- 對「狀態」變量的非標量賦值,例如
state @a = (1..3)
。
這些都是我所知道的:什麼樣的Perl代碼可能導致未定義的行爲?
my $x if ...
」)修改了「my
」語句的行爲。truncate()
,當長度比文件$i = $i++;
sort()
「1 << 32
」未定義。由負數位移位也是未定義的。state @a = (1..3)
。這些是關於修改正被遍歷的結構的主題只是變化:
map
,grep
和sort
其中代碼參考修改項進行排序的列表。
另一個問題與sort
出現在代碼引用不(在基本的計算機科學意義上的)冪等 - sort_func($a, $b)
必須始終對於任何給定$a
和$b
返回相同的值。
我再也不記得這種情況了,但是有一次我試圖通過傳遞一個非冪等的sortsub來濫用'sort',並得到了有趣的離奇結果。 – 2010-02-01 23:05:08
一個容易絆倒的人過早地擺脫了循環,同時通過與each
的散列迭代。
#!/usr/bin/perl
use strict;
use warnings;
my %name_to_num = (one => 1, two => 2, three => 3);
find_name(2); # works the first time
find_name(2); # but fails this time
exit;
sub find_name {
my($target) = @_;
while(my($name, $num) = each %name_to_num) {
if($num == $target) {
print "The number $target is called '$name'\n";
return;
}
}
print "Unable to find a name for $target\n";
}
輸出:
The number 2 is called 'two'
Unable to find a name for 2
這顯然是一個愚蠢的例子,但問題依然存在 - 通過散列與each
迭代時,你要麼永遠last
或return
跳出循環;或者您應該在每次搜索之前重置迭代器(使用keys %hash
)。
非常有用!謝謝! – snoofkin 2011-08-07 21:48:14
這應該是社區維基 – Quentin 2010-02-01 12:11:30
我很着迷知道爲什麼有人認爲這個問題應該關閉。 – 2010-02-01 12:17:25
這不是一個真正可以回答的問題,因爲它詢問了Perl規範中不受支持和未定義的行爲,以及可能潛伏的任何錯誤。 – Ether 2010-02-01 16:08:04