这些都是我所知道的:什么样的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