2010-02-26 68 views
3

在Perl中,我有一個字符串,大約看起來像如何在Perl中將字符串優雅地分割出來?

my $str = "one 10 two 20 three 30"; 

現在,我想拆分字符串轉換成字號碼對,但有 沒有成功。

我想我可以做一個

my @pairs = split /([a-z]+[^a-z]+)/, $str; 

,然後將有

$pairs[0] eq 'one 10 ' 
$pairs[1] eq 'two 20 ' 
$pairs[2] eq 'three 30' 

不過,我得到

$pairs[0] eq ' ' 
$pairs[1] eq 'one 10 ' 
$pairs[2] eq ' ' 
$pairs[3] eq 'two 20 ' 
$pairs[4] eq ' ' 
$pairs[5] eq 'three 30' 

現在,我可以用grep我想要的結果:

my @pairs = grep {$_ =~ /\S/} split /([a-z]+[^a-z]+)/, $str; 

但我想知道是否有更優雅的解決方案來解決這個問題。

回答

6

不知道,如果它是一個完美的解決方案,你可以使用帶有/g修改匹配:

my @pairs = $str =~ /(\w+\s+\d+)/g; 
15

爲什麼它們拆分成對?只要得到一個單詞列表,然後兩個一個地帶他們。

my @words = split /\s+/, $str; 
while(@words) { 
    my($first, $second) = splice @words, 0, 2; 
    ...; 
    } 

如果你想有一個哈希值,這是更簡單:

my %pairs = split /\s+/, $str; 

我發現更容易理解並傳遞到另一個程序員不是一個正則表達式。

+1

+1爲散列解決方案,談論'在盒子外'的想法... – Zaid

+7

哈希不是開箱即用。幾乎任何時候有人說「對」,你應該聽到「哈希」:) –

+1

也許最好使用'split'',$ str',如果跳過前導和尾隨空白是你想要的。據說還有一些特殊的優化。 – codeholic