2015-12-15 77 views
1

我有一些數據應該可以輕鬆拆分爲散列。Perl拆分並丟棄一行中的第一個元素

以下代碼旨在將字符串拆分爲相應的鍵/值對並將輸出存儲在散列中。

代碼:

use Data::Dumper; 

# create a test string 
my $string = "thing1:data1thing2:data2thing3:data3"; 

# Doesn't split properly into a hash 
my %hash = split m{(thing.):}, $string; 
print Dumper(\%hash); 

然而在檢查輸出很顯然,作爲打算在代碼不起作用。

輸出:

$VAR1 = { 
    'data3' => undef, 
    ''  => 'thing1', 
    'data2' => 'thing3', 
    'data1' => 'thing2' 
}; 

爲了進一步研究我的輸出分割成一個陣列,而不是與打印結果的問題。

代碼:

# There is an extra blank element at the start of the array 
my @data = split m{(thing.):}, $string; 
for my $line (@data) { 
    print "LINE: $line\n"; 
} 

輸出:

LINE: 
LINE: thing1 
LINE: data1 
LINE: thing2 
LINE: data2 
LINE: thing3 
LINE: data3 

正如你所看到的問題是,split是在陣列開始返回一個額外的空元素。


有,我可以從分割輸出丟掉的第一個元素,並將其存儲在一個散在一行什麼辦法?

我知道我可以輸出存儲在一個數組,然後只是推卸的第一個值,並存儲在一個哈希數組...但我只是好奇,這是否可以在一個完成步。

回答

5

my (undef, %hash) = split m{(thing.):}, $string;會丟掉第一個值。

+0

非常感謝!這麼簡單和優雅... – tjwrona1992

+0

不,除非數據是非常可預測的,每個鍵看起來像'data \ d'這是一個荒謬的解決方案 – Borodin

+4

對於問題「是否有任何方法可以拋棄第一個元素分裂的輸出?「我認爲這是正確的答案。 – bolav

4

我或者建議 - 使用regex沒有split

#!/usr/bin/env perl 
use strict; 
use warnings; 
use Data::Dumper; 

my $string = "thing1:data1thing2:data2thing3:data3"; 

my %results = $string =~ m/(thing\d+):([A-Z]+\d+)/ig; 
print Dumper \%results; 

當然,這確實讓,你匹配「字+數字」羣體,而沒有「數字」分離假設它將不會工作。我旨在主要說明這種技術 - 從字符串中抓取'配對'的值,因爲這樣他們就直接分配給一個散列。

您可能需要多一點複雜與正則表達式,例如nongreedy量詞:

my %results = $string =~ m/(thing.):(\w+?)(?=thing|$)/ig; 

這可能貶值它的清晰度方面。

+1

+1一個很好的答案,但是對於我所要做的事情來說,它要複雜得多,而且分裂的維度比正則表達式要好得多。 – tjwrona1992

+0

是的,它並不總是適用。但是對於很多情況,這只是因爲您可以放棄記錄分隔符,換行符等。 – Sobrique

相關問題