2

这是代码,我知道它不是完美的 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";
  }
}
4

3 回答 3

7

Perl 文档有一个关于“打印数组哈希”的教程(不使用Data::Dumper

perldoc perldsc

于 2012-01-05T00:59:26.807 回答
4

使用 Data::Dumper 的替代方法是使用 Data::Printer:

use Data::Printer;
p $value;

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

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];  
}
于 2012-01-05T00:58:14.360 回答
4

你正在艰难地做几件事。首先,散列已经将其键唯一化,因此您不需要执行此操作的循环。您似乎正在构建文件的哈希值,其值意味着在这些文件中找到的标题。输入数据是“文件名:标题”,每行一个。(你可以使用散列的散列,因为标头可能需要唯一化,但我们现在就让它过去吧。)

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. 如果我们将数组插入到打印语句中,Perl 会在它们之间添加空格。
  3. 如果我们压入一个空的散列元素,Perl 会自动在该元素中放入一个空的匿名数组,然后压入该元素。
于 2012-01-05T01:12:27.413 回答