关于哈希排序和在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循环。但它运作不好。我不知道为什么?

+1

呀,连关键字1的值是一个数组,因为你把数组'$数据{$关键字}'上 - 即创建阵列。 – Konerak 2010-11-17 07:25:40

首先,您需要通过“排序”来定义您的意思。你是否按键排序?按值?

如果你通过键排序,最简单的就是使用Perl内置的排序是这样的:

foreach (sort keys %data) { 
    print "$_ => $data{$_}; 
} 

如果你想按值进行排序,你可以定义排序由值的匿名排序功能:

foreach (sort {$data{$a} <=> $data{$b}} keys %data) { 
    print "$_ => $data{$_}; 
} 

如果你需要的任何其他排序,你可以定义在全局变量$a$b操作(它们被sort自动设置),并返回-1功能,01,具体取决于排序顺序。

如果你必须使用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 

看到Smart::Comments

这不是你想做的最后一步,我敢肯定。但它适用于那些你只是想窥视你收集到的东西的情况。

另一种方式是相似的:

use Data::Dumper; 
say Data::Dumper->Dump([ \%data ], [ '*data' ]);