2010-02-01 47 views
13

這些都是我所知道的:什麼樣的Perl代碼可能導致未定義的行爲?

  1. 與語句修改有條件的或循環結構(如「my $x if ...」)修改了「my」語句的行爲。
  2. 在標量上下文
  3. truncate(),當長度比文件
  4. 使用32位整數的長度大在同一語句修改變量兩次,像$i = $i++;
  5. sort()1 << 32」未定義。由負數位移位也是未定義的。
  6. 對「狀態」變量的非標量賦值,例如state @a = (1..3)
+1

這應該是社區維基 – Quentin 2010-02-01 12:11:30

+3

我很着迷知道爲什麼有人認爲這個問題應該關閉。 – 2010-02-01 12:17:25

+0

這不是一個真正可以回答的問題,因爲它詢問了Perl規範中不受支持和未定義的行爲,以及可能潛伏的任何錯誤。 – Ether 2010-02-01 16:08:04

回答

3

這些是關於修改正被遍歷的結構的主題只是變化:

mapgrepsort其中代碼參考修改項進行排序的列表。

另一個問題與sort出現在代碼引用不(在基本的計算機科學意義上的)冪等 - sort_func($a, $b)必須始終對於任何給定$a$b返回相同的值。

+1

我再也不記得這種情況了,但是有一次我試圖通過傳遞一個非冪等的sortsub來濫用'sort',並得到了有趣的離奇結果。 – 2010-02-01 23:05:08

3

一個容易絆倒的人過早地擺脫了循環,同時通過與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迭代時,你要麼永遠lastreturn跳出循環;或者您應該在每次搜索之前重置迭代器(使用keys %hash)。

+0

非常有用!謝謝! – snoofkin 2011-08-07 21:48:14

相關問題