2008-12-16 169 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; 
相关问题