0

新手来了 如果我缺少详细信息,请致歉。

在 perl 5 中

我有一个看起来像这样的文件

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

我可以毫无问题地遍历文件并创建一个保存优先级值的 $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 回答