2012-01-05 3 views
2

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

Можете ли вы использовать другой модуль из CPAN вместо Data :: Dumper? – stevenl

+1

В чем проблема, которую вы пытаетесь решить? Что не так с 'Data :: Dumper'? Это модуль Core, и его выход может быть настроен ('perldoc Data :: Dumper'). – toolic

+0

Мне нужно переместить набор заголовков через 100+ файлов в конец файлов #include в программе на C++/C. Они должны быть включены последними из-за конфликтов пространства имен между C и C++ файлами. Я не собираюсь делать это вручную. Поэтому у меня есть хэш файлов с заголовками в списке, который нужно переместить на дно. –

ответ

4

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

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

Альтернативой использованию Data :: Dumper является использование данных :: Принтер:

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]; 
} 
+0

Мне нужно уметь пересчитывать данные, чтобы не только печатать, но и обрабатывать их. –

+0

Я думаю, что данные :: Принтер не имеет значения. Хотя я надеюсь, что другие предложения помогут. – stevenl

7

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

perldoc perldsc

Смежные вопросы