Perl печатает хэш массивов без данных :: Dumper - PullRequest
2 голосов
/ 05 января 2012

Вот код, я знаю, что это не идеальный 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 ]

7 голосов
/ 05 января 2012

В документации по Perl есть учебное пособие " Печать хеша массивов " (без использования Data::Dumper)

perldoc perldsc

4 голосов
/ 05 января 2012

Вы делаете пару вещей трудным путем. Во-первых, хеш уже удалит свои ключи, поэтому вам не нужен цикл, который это делает. Похоже, вы создаете хэш файлов со значениями, которые должны быть заголовками, найденными в этих файлах. Входными данными является «имя файла: заголовок», по одному на строку. (Вы можете использовать хэш хэшей, так как заголовки могут нуждаться в унификации, но давайте пока это оставим.)

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 автоматически помещает пустой анонимный массив в элемент, а затем помещает его в него.
4 голосов
/ 05 января 2012

Альтернативой использованию 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];  
}
...