2010-02-01 45 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

相关问题