【问题标题】:Question on Hash Sort and Print in PerlPerl中关于哈希排序和打印的问题
【发布时间】:2010-11-17 07:03:26
【问题描述】:

我在如何打印我的哈希内容时遇到了麻烦。

将sn-p编码成这样,

#!/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)

实际上,我认为 Keyword1 的值(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 的值也是一个数组,因为您推送数组 $data{$keyword} - 创建数组。

标签: perl hash


【解决方案1】:

首先,您需要定义“排序”的含义。你是按键排序吗?按价值观?

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

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

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

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

如果你想要任何其他排序,你可以定义一个函数来操作全局变量$a$b(它们由sort自动设置)并返回-10或@ 987654328@ 取决于排序顺序。

如果您必须使用 while 循环来执行此操作,我需要再考虑一下。

【讨论】:

    【解决方案2】:

    我知道的最简单的方法:

    use Smart::Comments;
    ...
    ### %data
    

    Smart::Comments

    我敢肯定,这不是您想要做的最后一步。但它适用于您只想查看所收集内容的情况。

    另一种方式类似:

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

    【讨论】:

      【解决方案3】:

      最终,我找到了在 Perl 中打印 Array of 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-25
        • 1970-01-01
        • 2011-10-27
        • 2017-09-30
        • 2016-12-18
        • 2012-07-22
        • 1970-01-01
        相关资源
        最近更新 更多