2008-12-16 168 views
31

我該如何在Perl中取出一個字符串,並將其分成一個數組,每個條目兩個字符長?如何在Perl中將字符串分成兩個字符塊?

我嘗試這樣的:

@array = split(/../, $string); 

,但沒有得到預期的結果。

最後,我想在把這樣的事情

F53CBBA476 

到包含數組

F5 3C BB A4 76 

回答

52
@array = ($string =~ m/../g); 

模式匹配運營商以特殊的方式表現在Perl中的列表上下文。它迭代地處理操作,在上一次匹配之後將模式與文本的其餘部分進行匹配。然後,列表由在模式匹配的每個應用程序期間匹配的所有文本形成。

37

如果你真的必須使用split,你可以做:

grep {length > 0} split(/(..)/, $string); 

但我認爲最快的方式將與unpack

unpack("(A2)*", $string); 

這兩種方法有「優勢」是如果字符串有奇數個字符,它將自行輸出最後一個字符。

+0

由於它看起來像他正在處理十六進制字符,所以這是一個模擬點,但A只適用於ASCII字符。分割應該適用於任何編碼,但是您可能想要在正則表達式中添加/ s,因此「\ n」將與「。」匹配。 – 2009-04-28 21:34:27

+2

應該是`a2`,而不是`A2`。前者剝去了空白,這是多餘的。 – ikegami 2011-05-19 16:28:59

6

其實,趕上奇的性格,你想第二個字符可選:

@array = ($string =~ m/..?/g); 
5

傳遞給split模式確定什麼中隔離是你想要的。如果你想使用分割,你會使用類似

my @pairs = split /(?(?{ pos() % 2 })(?!))/, $string; 

my @pairs = split /(?=(?:.{2})+\z)/s, $string; 

這些都是比較差的解決方案。更好的解決方案包括:

my @pairs = $string =~ /..?/sg; # Accepts odd-length strings. 

my @pairs = $string =~ /../sg; 

my @pairs = unpack '(a2)*', $string; 
相關問題