数组到哈希perl

时间:2011-11-29 11:25:55

标签: perl

这是与此名称相同的线程(Working with Spreadsheet::ParseExcel)。由于其中一些人认为标题和问题没有意义。很抱歉没有轻松。

我的问题是:像这样的数组

TY45745a A,B
TY45745a C,D
TY45745a E,F
TY5475a G,H
TY5475a I,J
TY5475a K,L

应该像这样的哈希。

TY45745a =>(A,B,C,D,E,F) TY5475a =>(G,H,I,J,K,L)

下一部分是重命名文件,如果文件名在文件末尾有[AE],那么它应该重命名为TY45745a [1..6],如果它有[ GL] TY5475a [1..6]。

%hash = @array。

但这会导致

TY45745a => A,B
TY45745a => C,D
TY45745a => E,F
TY5475a =>  G,H
TY5475a =>  I,J
TY5475a =>  K,L

我应该如何分组?感谢您的时间和建议

编辑:对不起,Bu不会工作,因为wen通过for循环,部分的outpur将是这样的:

TY45745a
A,B
TY45745a
C,D
TY45745a
E,F
TY5475a
G,H
TY5475a
I,J
TY5475a
K,L

2 个答案:

答案 0 :(得分:2)

在问题中使用更新的数组:

my $hash = {};

for my $part (@arr) {
    my ($key, $values) = split/ /, $part;
    push @{$hash->{$key}}, $_ for split/,/, $values;
}

我不确定你更换[A-F]和[G-L]的意思,因为这会产生你所描述的所需输出而没有任何替换。

答案 1 :(得分:0)

#/usr/bin/perl
use List::MoreUtils;
use Data::Dumper;

my $h; 
my @a = ("TY45745a", "A,B", 
         "TY45745a", "C,D", 
         "TY45745a", "E,F", 
         "TY5475a",  "G,H", 
         "TY5475a",  "I,J", 
         "TY5475a",  "K,L");

my $it = List::MoreUtils::natatime 2, @a; 

while (my ($k,$v) = $it->()) { 
    print "$k => $v"; 
    push @{$h->{$k}}, split /,/, $v; 
}; 

print Dumper($h)

给出:

TY45745a => A,B
TY45745a => C,D
TY45745a => E,F
TY5475a => G,H
TY5475a => I,J
TY5475a => K,L

$VAR1 = {
      'TY5475a' => [
                     'G',
                     'H',
                     'I',
                     'J',
                     'K',
                     'L'
                   ],
      'TY45745a' => [
                      'A',
                      'B',
                      'C',
                      'D',
                      'E',
                      'F'
                    ]
    };