从单个阵列创建多个卡条目

时间:2014-04-16 09:56:04

标签: perl perl-data-structures

我正在制作一个快速而肮脏的书名安排,其中标题由诸如shelfcode之类的元标签排列,然后由作者排列,然后按标题排列。元标记的数量可能会有所不同(按货架代码排序,然后是国家/地区,然后是作者,最后是标题或其他内容),元素数量可能会有所不同。

我有一个排序顺序

my @Stapel =  ( "133 ; 101", "smith ; jones ; harrods", "The Book of Kelts") ;

包含3个元标记(shelfcode,authorname,title),其中第一个metatag有2个elemetns,第二个元素包含3个elemetns,最后一个metatag包含一个元素。

我想要的是输出如下所示,每个标题首先按货架编码排列,然后由每个作者按标题排列:

101     harrods The Book of Kelts
101     jones   The Book of Kelts
101     smith   The Book of Kelts
133     harrods The Book of Kelts
133     jones   The Book of Kelts
133     smith   The Book of Kelts

我到目前为止做了我想做的事情,但它都是硬编码而且太简单了:

# Create an array of arrays of each element
foreach (@Stapel) {
    my @s = split / ; / ;
    print "\n - subarray has " . @s . " elements which are: '@s'" ;
    push @BIG, ( [@s] ) ;
}

for ($p=0 ; $p<@BIG ; $p++) {    
    foreach (sort @{ $BIG[$p] }   ) { 
        $a = $_ ;
        foreach (sort @{ $BIG[$p+1] }   ) {
            $b = $_ ;
            foreach (@{ $BIG[$p+2] }    ) {
                $c = $_ ;
                $Entry = "$a\t$b\t$c" ; 
                print "\n$Entry" ;
            }
        }
    }
}   # for

如何使这更加灵活,即每个元标记的元素数量可能会有所不同,元标记的数量也可能不同。我试图在这里使用递归,但我很困惑。

1 个答案:

答案 0 :(得分:0)

你可以使用数组的哈希:

#!/usr/bin/perl
use strict;
use warnings;

my @Stapel =  ( "133 ; 101", "smith ; jones ; harrods", "The Book of Kelts") ;

sub arr_to_hash { # converts your array to an hash
  my $arr = shift;
  my %hash = ();
  $hash{shelfcode} = [ split /\s*;\s*/, $arr->[0] ];
  $hash{authorname} = [ split /\s*;\s*/, $arr->[1] ];
  $hash{title} = $arr->[2];
  return %hash;
}

my %stapel_hash = arr_to_hash(\@Stapel);

for my $shelfcode (sort @{$stapel_hash{shelfcode}}) {
  for my $author (sort @{$stapel_hash{authorname}}) {
    print "$shelfcode\t$author\t$stapel_hash{title}\n";
  }
}

我认为这几乎是相同的复杂性,但它更灵活一些。