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 のドキュメントには、" Printing of a HASH OF ARRAYS " (使用せずにData::Dumper)に関するチュートリアルがあります。

perldoc perldsc

于 2012-01-05T00:59:26.807 に答える
4

Data::Dumper を使用する代わりに、Data::Printer を使用することができます。

use Data::Printer;
p $value;

これを使用して、出力の形式をカスタマイズすることもできます。たとえば、インデックスなしですべてを 1 行に含めることができます (その他のオプションについては、ドキュメントを参照してください)。

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

また、一意のファイルを取得するための提案として、要素を aa ハッシュに入れます。

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

実際には、そのステップをスキップして、1 回のパスですべてを %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

あなたはいくつかのことを難しい方法でやっています。まず、ハッシュはすでにそのキーを一意化するため、それを行うループは必要ありません。ファイルのハッシュを作成しているようで、値はそれらのファイルで見つかったヘッダーであることを意味しています。入力データは「filename:header」で、1 行に 1 つずつです。(ヘッダーの一意化が必要になる場合があるため、ハッシュのハッシュを使用できますが、ここでは省略します。)

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 は自動的に空の無名配列を要素に入れ、それからプッシュします。
于 2012-01-05T01:12:27.413 に答える