关于哈希排序和在Perl中打印的问题
问题描述:
我在如何打印我的哈希内容时遇到了麻烦。关于哈希排序和在Perl中打印的问题
的代码片段,因为这,
#!/usr/bin/perl -w
use strict;
use warnings;
my (%data, $keyword);
while (my $line = <DATA>){
next unless $line =~ /\S/;
chomp $line;
if ($line =~ /^Keyword/){
$keyword = $line;
}
else {
push @{$data{$keyword}}, $line;
}
}
# How to sort by keys using while loop?
while (my ($k,$v) = each %data) {
print "$k => $v\n";
}
# BTW, foreach loop sorting works.
#foreach my $key (sort (keys(%data))) {
# print "$key \t$data{$key}\n";
#}
__DATA__
Keyword1
data1 a
Keyword2
data2 a
data2 b
data2 c
Keyword3
data3 a
data3 b
Keyword4
data4 a
data4 b
输出:
D:\learning\perl>sc4.pl
Keyword3 => ARRAY(0x18418fc)
Keyword1 => ARRAY(0x28925c)
Keyword2 => ARRAY(0x2892fc)
Keyword4 => ARRAY(0x184360c)
其实,我不认为关键字1值(data1 a
,只有一行)是ARRAY。但输出仍然显示它是一个数组。
你能否给我一些关于如何正确打印的建议。
赞赏您的意见。
[更新]
更新我的代码while loop
尝试打印值数组。但仍然失败。
while (my ($k,@v) = each %data) {
print "$k\n";
foreach (@v) {
print Dumper (@v);
print "$_\n";
}
}
输出:
D:\learning\perl>sc4.pl
Keyword3
$VAR1 = [
'data3 a',
'data3 b'
];
ARRAY(0x189a674)
Keyword1
$VAR1 = [
'data1 a'
];
ARRAY(0x28925c)
Keyword2
$VAR1 = [
'data2 a',
'data2 b',
'data2 c'
];
ARRAY(0x2892fc)
Keyword4
$VAR1 = [
'data4 a',
'data4 b'
];
ARRAY(0x1841a74)
我已经定义由while循环来处理数组值包括在另一foreach循环。但它运作不好。我不知道为什么?
答
首先,您需要通过“排序”来定义您的意思。你是否按键排序?按值?
如果你通过键排序,最简单的就是使用Perl内置的排序是这样的:
foreach (sort keys %data) {
print "$_ => $data{$_};
}
如果你想按值进行排序,你可以定义排序由值的匿名排序功能:
foreach (sort {$data{$a} <=> $data{$b}} keys %data) {
print "$_ => $data{$_};
}
如果你需要的任何其他排序,你可以定义在全局变量$a
和$b
操作(它们被sort
自动设置),并返回-1
功能,0
或1
,具体取决于排序顺序。
如果你必须使用while
循环来做到这一点,那么我需要给它更多的思考。
答
最终,我找到了在Perl中打印数组的Array的解决方案。
我更新了我的While Loop
,如下所示。
while (my ($k,@v) = each %data) {
print "$k\n";
print Dumper (@v);
for (my $i = 0; $i < @v; $i++) {
for (my $j = 0; $j < @{$v[$i]}; $j++) {
print STDOUT "\$i: " . $i . " \$j: " . $j . " value: " . $v[$i][$j] . "\n";
}
}
}
输出:我知道
D:\learning\perl>sc4.pl
Keyword3
$VAR1 = [
'data3 a',
'data3 b'
];
$i: 0 $j: 0 value: data3 a
$i: 0 $j: 1 value: data3 b
Keyword1
$VAR1 = [
'data1 a'
];
$i: 0 $j: 0 value: data1 a
Keyword2
$VAR1 = [
'data2 a',
'data2 b',
'data2 c'
];
$i: 0 $j: 0 value: data2 a
$i: 0 $j: 1 value: data2 b
$i: 0 $j: 2 value: data2 c
Keyword4
$VAR1 = [
'data4 a',
'data4 b'
];
$i: 0 $j: 0 value: data4 a
$i: 0 $j: 1 value: data4 b
答
最简单的方法:
use Smart::Comments;
...
### %data
这不是你想做的最后一步,我敢肯定。但它适用于那些你只是想窥视你收集到的东西的情况。
另一种方式是相似的:
use Data::Dumper;
say Data::Dumper->Dump([ \%data ], [ '*data' ]);
呀,连关键字1的值是一个数组,因为你把数组'$数据{$关键字}'上 - 即创建阵列。 – Konerak 2010-11-17 07:25:40