使用转储程序对perl中的哈希进行排序
我有一个散列如下:使用转储程序对perl中的哈希进行排序,perl,sorting,hash,dump,Perl,Sorting,Hash,Dump,我有一个散列如下: %hash = { car => { '10' => 'y', '11' => 'y', '12' => 'y', '13' => 'y' }, bus => { '10' => 'y', '11' => 'y', '12' => 'y', '13' => 'y'
%hash = {
car => {
'10' => 'y',
'11' => 'y',
'12' => 'y',
'13' => 'y'
},
bus => {
'10' => 'y',
'11' => 'y',
'12' => 'y',
'13' => 'y'
},
tr => {
'10' => 'y',
'11' => 'y',
'12' => 'y',
'13' => 'y'
}
}
#!/usr/bin/perl
use strict;
use warnings;
use feature qw(switch say);
my $hash = {
car => {
'10' => 'y',
'11' => 'y',
'12' => 'y',
'13' => 'y'
},
bus => {
'10' => 'y',
'11' => 'y',
'12' => 'y',
'13' => 'y'
},
tr => {
'10' => 'y',
'11' => 'y',
'12' => 'y',
'13' => 'y'
}
};
foreach my $key0 (sort keys %$hash) {
say "$key0";
foreach my $key1 (sort { $a <=> $b } keys %{$hash->{$key0}}) {
say "\t$key1 $hash->{$key0}->{$key1}";
}
}
如何在PERL中打印此哈希(使用转储程序),其中每个部分的键按上述顺序排序(10、11、12、13、14…)
提前感谢,
Miki如果希望哈希的键按顺序输出,则需要在打印它们之前对其进行排序 如果要使用
Data::Dumper
转储哈希并希望按排序顺序转储其键,可以将$Data::Dumper::Sortkeys
设置为true,然后正常转储
您可以像下面这样手动对散列的键进行排序:
%hash = {
car => {
'10' => 'y',
'11' => 'y',
'12' => 'y',
'13' => 'y'
},
bus => {
'10' => 'y',
'11' => 'y',
'12' => 'y',
'13' => 'y'
},
tr => {
'10' => 'y',
'11' => 'y',
'12' => 'y',
'13' => 'y'
}
}
#!/usr/bin/perl
use strict;
use warnings;
use feature qw(switch say);
my $hash = {
car => {
'10' => 'y',
'11' => 'y',
'12' => 'y',
'13' => 'y'
},
bus => {
'10' => 'y',
'11' => 'y',
'12' => 'y',
'13' => 'y'
},
tr => {
'10' => 'y',
'11' => 'y',
'12' => 'y',
'13' => 'y'
}
};
foreach my $key0 (sort keys %$hash) {
say "$key0";
foreach my $key1 (sort { $a <=> $b } keys %{$hash->{$key0}}) {
say "\t$key1 $hash->{$key0}->{$key1}";
}
}
请参见中的
Sortkeys
。您可以将其设置为对哈希键进行排序的子例程。您可以尝试
use Data::Dumper;
local $Data::Dumper::Sortkeys = 1;
# using custom sort function
# local $Data::Dumper::Sortkeys = sub { [ sort keys %{+shift} ] };
print Dumper {
car => {
'10' => 'y',
'11' => 'y',
'12' => 'y',
'13' => 'y'
},
bus => {
'10' => 'y',
'11' => 'y',
'12' => 'y',
'13' => 'y'
},
tr => {
'10' => 'y',
'11' => 'y',
'12' => 'y',
'13' => 'y'
}
}
输出
$VAR1 = {
'bus' => {
'10' => 'y',
'11' => 'y',
'12' => 'y',
'13' => 'y'
},
'car' => {
'10' => 'y',
'11' => 'y',
'12' => 'y',
'13' => 'y'
},
'tr' => {
'10' => 'y',
'11' => 'y',
'12' => 'y',
'13' => 'y'
}
};
从
$Data::Dumper::Sortkeys
可以设置为布尔值,以控制哈希键是否按排序顺序转储。真值将导致所有哈希的键以Perl的默认排序顺序转储。也可以设置为子例程引用,该引用将为转储的每个哈希调用。在这种情况下,Data::Dumper将为每个哈希调用一次子例程,并将哈希的引用传递给它。子例程的目的是返回对将被转储的键数组的引用,其顺序是它们应该被转储的顺序。使用此功能,您可以控制键的顺序以及实际使用的键。换句话说,此子例程充当过滤器,通过它可以排除某些键被转储。默认值为0,这意味着哈希键未排序
但是你会有多个相同密钥的条目,这是被禁止的。你说的“打印到数组中”是什么意思?您能显示预期结果吗?始终
使用strict;使用警告
然后您应该使用my$hash={…}
或my%hash=(…)
而不是%hash={…}
。阅读以了解原因。抱歉-使用转储程序写入文件。谢谢,但有没有一种方法可以使用转储程序执行此操作?@Mike Sure。在转储之前,只需将$Data::Dumper::Sortkeys
设置为true。