哪些perl代码示例会导致未定义的行为?
这些是我所知道的:哪些perl代码示例会导致未定义的行为?,perl,Perl,这些是我所知道的: 使用语句修饰符条件或循环构造修改的“my”语句的行为(例如“my$x if…”) 在同一语句中修改变量两次,如$i=$i++ 标量上下文中的排序() truncate(),当长度大于文件长度时 使用32位整数,“1这些只是修改正在迭代的结构主题的变体: map、grep和sort,其中代码引用修改要排序的项目列表 sort的另一个问题出现在代码引用不是幂等(comp-sci意义上)的情况下--sort\u func($a,$b)必须始终为任何给定的$a和$b返回相同的值,容易
my
”语句的行为(例如“my$x if…
”)$i=$i++代码>
truncate()
,当长度大于文件长度时1这些只是修改正在迭代的结构主题的变体:
map
、grep
和sort
,其中代码引用修改要排序的项目列表
sort
的另一个问题出现在代码引用不是幂等(comp-sci意义上)的情况下--sort\u func($a,$b)
必须始终为任何给定的$a
和$b返回相同的值,容易被绊倒的值在使用每个迭代哈希时过早地中断循环
#!/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
这显然是一个愚蠢的例子,但问题仍然存在——当使用每个
遍历哈希时,您不应该最后一个或返回
,或者应该重置迭代器(使用键%hash
)每次搜索前。我已经记不清当时的情况了,但有一次我试图滥用排序
,通过传递一个非幂等sortsub,得到有趣的奇怪结果。查看此页面:这应该是社区维基。我很想知道为什么有人认为这个问题应该关闭。这不是一个真正可以回答的问题,一个简单的问题它询问的是Perl规范中不受支持和未定义的行为,以及任何可能潜伏的bug。@以太:我认为这就是问题所在。如果你知道什么不起作用,特别是如果有充分的理由,你可以避免它。