2011-11-29 68 views
-2

這是與此不同名稱的相同線程(Working with Spreadsheet::ParseExcel)。由於其中一些人提出了標題,而這個問題沒有意義。對不起,不容易。Array to a hash perl

我的問題是:這樣的

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 

我應該怎樣組呢?感謝您的時間和建議

編輯:對不起,卜,不會becos文工作,通過一部分的for循環outpur通過會是這樣:

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

你能嘗試打印原始數組中一個更清晰的方式? – nicomen

+0

你最近的修改是在說什麼?對答案的評論屬於您評論的答案。如果您只是在您的代碼中顯示陣列,那麼幫助您會更容易。 '('TY45745a','A,B',...)或'('TY45745a A,B',...)'不清楚。無論哪種方式'%hash = @ array'不會產生您描述的輸出。 – flesk

回答

2

隨着問題的更新陣列這個工程:

my $hash = {}; 

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

我不知道你的意思更換[AF]什麼[GL]雖然,因爲這會產生你所描述什麼是你想要的輸出沒有任何替代品。

+0

正是我要提交 –

+0

@JoelBerger:我會把它當作恭維。 ;)高爾夫版本'map {push @ {$ hash - > {shift @ $ _}},@ $ _} map {[split/[,] /]} @ arr;' – flesk

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' 
        ] 
    };