0

ここの初心者。詳細が不足している場合はお詫び申し上げます。

Perl5で

このようなファイルがあります

precedence = 2
new york
new jersey
florida
precedence = 3
kings
essex
dade
precedence = 1
brooklyn
newark
miami

ファイルをループして、precedenceの値を保持する$ varと、次の「セクション」(precedence = x)まで行を保持する配列(@tmp)を作成することに問題はありません。

最終的に、すべてのセクションを優先順に最終配列にプッシュする必要があります

それで

print @final;

結果は

 brooklyn
 .....
 new york
 .....
 kings
 .....

注:セクションがいくつあるか、各セクションに何行あるかを事前に知ることはできません。

おそらくハッシュのハッシュを作成し、各配列をHoHに配置することを考えました

push @{ $hash{"section_2"} }, @tmp ;

でも知らなかった

a)セクションをロードするたびに@tmp配列を再利用する際に問題が発生する場合(各ループの開始時にセクションをブランクにした後)

b)キー「section_2」の配列内のすべての値を取得して@finalにプッシュする方法を理解できませんでした

もちろん、もっと良いアプローチがあるかもしれません。

4

2 に答える 2

2

HoH は意味がありません。優先レベル (1、1000000、1000000000) に大きな差異が予想される場合は、HoA を使用できます。

my $precedence = 0;
my %data;
while (<>) {
   chomp;
   if (/precedence\s*=\s*([0-9]+)\z/) {
      $precedence = $1;
      next;
   }

   push @{ $data{$precedence} }, $_;
}

my @final = map @{ $data{$_} }, sort { $a <=> $b } keys %data;

しかし、AoA の方が適している可能性が高いでしょう。

my $precedence = 0;
my @data;
while (<>) {
   chomp;
   if (/precedence\s*=\s*([0-9]+)\z/) {
      $precedence = $1;
      next;
   }

   push @{ $data[$precedence] }, $_;
}

my @final = map @$_, grep $_, @data;
于 2013-02-11T18:51:47.790 に答える
0

あなたが何を達成しようとしているのか完全にはわかりませんが、各優先順位の値を出力してから、その配列の値を出力する場合は、次のことを試してください。

my $hoh;

#This is not how you populate your HoH, I hard code it to simplify
@{$hoh->{2}->{'ARRAY'}} = ('new york', 'new jersey', 'florida');
@{$hoh->{3}->{'ARRAY'}} = ('kings', 'essex', 'dade');
@{$hoh->{1}->{'ARRAY'}} = ('brooklyn', 'newark', 'miami');

foreach my $prcdnc(keys(%$hoh))
{
    print "\nprcdnc = ".$prcdnc;

    my @prcdncAry = @{$hoh->{$prcdnc}->{'ARRAY'}};

    my $prcdncAryStr = join(",", @prcdncAry);

    print "\n\t".$prcdncAryStr;
}
于 2013-02-11T19:06:51.237 に答える