我的代码有两种情况不会导致分段错误:
- 当我至少在一个地方使用 Smart::Comments。
- 通过调试器运行。
我已经追踪到了这个调用:
$action->{breakdown}
= join( ' '
, each_pair {
my ( $name, $length ) = @_;
return "x$length" if $name eq 'FILLER';
push @$field_list_ref, $name;
return "A$length";
} @$field_def_ref
);
其中each_pair
在另一个模块中定义为:
sub each_pair (&@) {
my $block = shift;
return unless @_;
my $caller = caller();
my $aref = qualify( 'a', $caller );
my $bref = qualify( 'b', $caller );
my @results;
my $pairs = 0;
for ( my $index = 0; $index < $#_; $index += 2 ) {
$pairs++;
my @pair = @_[$index..($index+1)];
no strict 'refs';
local ( $$aref, $$bref ) = @pair;
push @results, $block->( @pair );
}
return wantarray || $pairs != 1 ? @results : shift @results;
}
- 现在我知道可以用List::MoreUtils::natatime替换each_pair(尽管我听说它有一些bug),他们最近允许在我们的环境中使用这个模块,但我仍然对为什么这个调用会导致分段错误感兴趣——或者其他Perl程序员用于调试分段错误的方法。
我在这上面浪费了一些时间。
编辑
我有其他使用此函数的模块,有些指望能够使用$a
和$b
,而且在同一模块的其他列表中也可以正常工作。我可以更改此函数的调用,我可以更改此文件的调用,但更改每个成功使用它的地方可能需要进行更多更改,这可能超出了我在这个时候被允许做出的更改。