关于Hash排序和打印的问题

Nan*_* HE 2 perl hash

我在如何打印哈希内容方面遇到了麻烦.

这段代码片段,

#!/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
Run Code Online (Sandbox Code Playgroud)

输出:

D:\learning\perl>sc4.pl
Keyword3 => ARRAY(0x18418fc)
Keyword1 => ARRAY(0x28925c)
Keyword2 => ARRAY(0x2892fc)
Keyword4 => ARRAY(0x184360c)
Run Code Online (Sandbox Code Playgroud)

其实,我不认为关键字1值(data1 a,只有一条线)为ARRAY.但输出仍显示它是一个阵列.

你能给我一些关于如何正确打印的建议.

感谢您的投入.

[更新]

我更新我的代码while loop以尝试打印values数组.但仍然失败了.

while ( my ($k,@v) = each %data ) {
    print "$k\n";
    foreach (@v) {
    print Dumper (@v);
    print "$_\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

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)
Run Code Online (Sandbox Code Playgroud)

我已经定义了while循环包含的另一个foreach循环来处理数组值.但它效果不好.我不知道为什么?

Nat*_*man 7

首先,您需要通过"排序"来定义您的意思.你按键排序吗?按价值观?

如果您按键排序,最简单的方法是使用Perl的内置排序,如下所示:

foreach (sort keys %data) {
    print "$_ => $data{$_};
}
Run Code Online (Sandbox Code Playgroud)

如果要按值排序,可以定义按值排序的匿名排序函数:

foreach (sort {$data{$a} <=> $data{$b}} keys %data) {
    print "$_ => $data{$_};
}
Run Code Online (Sandbox Code Playgroud)

如果你需要的任何其他排序,你可以定义操作,并且在全局变量的函数$a$b(它们被自动设置sort),并返回-1,01根据排序顺序.

如果你必须用while循环来做,我需要多考虑一下.