perl打印带有Data :: Dumper的数组的哈希值

时间:2012-01-05 00:27:59

标签: perl data-dumper

这是代码,我知道它不是完美的perl。如果您对我如何更好地了解我有所了解。我的主要问题是如何在不使用Data :: Dumper的情况下打印出数组?

#!/usr/bin/perl
use Data::Dumper qw(Dumper);

use strict;
use warnings;

open(MYFILE, "<", "move_headers.txt") or die "ERROR: $!";

#First split the list of files and the headers apart
my @files;
my @headers;
my @file_list = <MYFILE>;
foreach my $source_parts (@file_list) {
  chomp($source_parts);
  my @parts = split(/:/, $source_parts);
  unshift(@files, $parts[0]);
  unshift(@headers, $parts[1]);
}

# Next get a list of unique headers
my @unique_files;
foreach my $item (@files) {
  my $found = 0;
  foreach my $i (@unique_files) {
      if ($i eq $item) {
        $found = 1;
        last;
      }
  }
  if (!$found) {
    unshift @unique_files, $item;
  }
}
@unique_files = sort(@unique_files);

# Now collect the headers is a list per file
my %hash_table;
for (my $i = 0; $i < @files; $i++) {
  unshift @{ $hash_table{"$files[$i]"} }, "$headers[$i]";
}

# Process the list with regex
while ((my $key, my $value) = each %hash_table) {
  if (ref($value) eq "ARRAY") {
    print "$value", "\n";
  }
}

3 个答案:

答案 0 :(得分:7)

Perl文档有一个关于“打印HASH OF ARRAYS ”的教程(不使用Data::Dumper

perldoc perldsc

答案 1 :(得分:4)

使用Data :: Dumper的另一种方法是使用Data :: Printer:

use Data::Printer;
p $value;

您也可以使用它来自定义输出的格式。例如。您可以在没有索引的情况下将所有内容放在一行中(有关更多选项,请参阅documentation):

use Data::Printer {
    index     => 0,
    multiline => 0,
};
p $value;

此外,作为获取唯一文件的建议,请将元素放入哈希:

my %unique;
@unique{ @files } = @files;
my @unique_files = sort keys %unique;

实际上,您甚至可以跳过该步骤,并在一次传递中将所有内容放入%hash_table中:

my %hash_table;
foreach my $source_parts (@file_list) {
    chomp($source_parts);
    my @parts = split(/:/, $source_parts);
    unshift @{ $hash_table{$parts[0]} }, $parts[1];  
}

答案 2 :(得分:4)

你正在做一些艰难的事情。首先,哈希已经将其密钥唯一化,因此您不需要执行该操作的循环。您似乎正在构建文件哈希,其值应该是在这些文件中找到的标头。输入数据是“filename:header”,每行一个。 (你可以使用散列哈希,因为标题可能需要统一,但让我们暂时放弃。)

use strict;
use warnings;
open my $files_and_headers, "<", "move_headers.txt" or die "Can't open move_headers: $!\n";

my %headers_for_file;
while (defined(my $line = <$files_and_headers> )) {
        chomp $line;
        my($file, $header) = split /:/, $line, 2;
        push @{ $headers_for_file{$file} }, $header;
}

# Print the arrays for each file:
foreach my $file (keys %headers_for_file) {
    print "$file: @{ $headers_for_file{$file}}\n";
}

我们让Perl在这里完成一大部分工作:

  1. 如果我们向哈希添加密钥,它们总是唯一的。
  2. 如果我们将数组插入到print语句中,Perl会在它们之间添加空格。
  3. 如果我们推送一个空的哈希元素,Perl会自动在元素中放入一个空的匿名数组,然后再推送它。