我的第一个问题…我通过搜索找到了许多其他问题的答案,但我这次失败了:-)
我想生成一个报告,该报告按嵌入在输入数据字符串中的数字排序。报告是由perl散列的元素生成的,其中使用相同的数字作为散列键。
我当前得到的输出像字符串一样排序。
foreach my $num (sort keys %dir_map) {
$path = $paths{$num};
$name = $names{$num};
printf OUT ("%d %s %sn",$num,$path,$name);
}
我的输入数据看起来像:
dist_14 randomString nameStringIwant RandomInteger AnotherRandomString
我像这样处理
while(<IN>) {
chomp;
my @header = split /s+/;
my $header_length = $#header ;
if ( /dist_/ ) {
my $NumberStr = $header[0] ;
$justNumberStr =~ s/dist_//;
my $justNumber = sprintf("%d",$justNumberStr);
$names{$justNumber} = $header[2];
}
}
您已经发现,Perl的排序将在默认情况下使用字符串比较进行排序。要覆盖默认行为,您需要提供一个排序块。
foreach my $num (sort { $a <=> $b } keys %dir_map)
排序块在变量$a
和$b
中给定列表中的两个元素。您的代码应该比较这两个值,如果$a
在$b
之前,则返回一个负整数,如果$b
在$a
之前,则返回一个正整数,如果它们在相同的位置排序,则返回零。"宇宙飞船操作员"(<=>
)对两个数字做了同样的处理。
FAQ如何按(任何东西)排序数组?可能也有用。你没有一个数组,但是你的键列表可以用同样的方式处理。