2013-06-22 54 views
0

我有一個數組如下:轉換陣列散列使用grep和映射在Perl

@array = ('a:b','c:d','e:f:g','h:j'); 

我如何可以轉換到這個下面使用grep和地圖?

%hash={a=>1,b=>1,c=>1,d=>1,e=>1,f=>1,h=>1,j=>1}; 

我已經試過:

@arr; 

foreach(@array){ 
    @a = split ':' , $_; 
    push @arr,@a; 

} 


    %hash = map {$_=>1} @arr; 

,但我得到的所有值我應該得到單個陣列

+0

你想'g'也? – hwnd

+0

@JasonGray:他說,*「我應該得到單個數組的前兩個值」* – Borodin

回答

4

它很容易的前兩個值:

%hash = map {$_=>1} grep { defined $_ } map { (split /:/, $_)[0..1] } @array; 

所以,你拆分每個數組元素用「:」分隔符,getti ng數組越大,只取第2個值;然後grep定義值並將其傳遞給其他地圖鍵值對。

+0

爲什麼'grep'? – Borodin

+0

@Borodin如果'split'返回大小爲1的數組,slice'[0..1]'無論如何都會返回2個元素。 – PSIAlt

1

你必須split後忽略除前兩個元素應有盡有,

my @arr; 
foreach (@array){ 
    @a = split ':', $_; 
    push @arr, @a[0,1]; 
} 

    my %hash = map {$_=>1} @arr; 

使用地圖,

my %hash = 
    map { $_ => 1 } 
    map { (split /:/)[0,1] } 
    @array; 
1

我認爲這應該工作,雖然不夠高貴。我使用臨時數組來保存split的結果並返回前兩個元素。

my %hash = map { $_ => 1 } map { my @t = split ':', $_; $t[0], $t[1] } @array; 
1

這種過濾掉g關鍵

my %hash = map { map { $_ => 1; } (split /:/)[0,1]; } @array;