什么perl代码示例可能导致未定义的行为?

时间:2010-02-01 12:03:45

标签: perl

这些是我所知道的:

  1. 使用语句修饰符条件或循环结构修改的“my”语句的行为(例如“my $x if ...”)。
  2. 在同一语句中修改变量两次,例如$i = $i++;
  3. 标量上下文中的
  4. sort()
  5. truncate(),当LENGTH大于文件的长度时
  6. 使用32位整数,“1 << 32”未定义。以负数位移位也是不确定的。
  7. 对“状态”变量的非标量分配,例如state @a = (1..3)

2 个答案:

答案 0 :(得分:5)

容易绊倒的是在使用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)。

答案 1 :(得分:4)

这些只是修改正在迭代的结构主题的变体:

mapgrepsort,其中代码引用修改要排序的项目列表。

sort的另一个问题出现在代码引用不是幂等的(在comp sci意义上) - sort_func($a, $b)必须始终为任何给定的$a和{{返回相同的值1}}。