如何在Perl中将字符串分成两个字符块?
问题描述:
我该如何在Perl中取出一个字符串,并将其分成一个数组,每个条目两个字符长?如何在Perl中将字符串分成两个字符块?
我尝试这样的:
@array = split(/../, $string);
,但没有得到预期的结果。
最后,我想在把这样的事情
F53CBBA476
到包含数组
F5 3C BB A4 76
答
@array = ($string =~ m/../g);
模式匹配运营商以特殊的方式表现在Perl中的列表上下文。它迭代地处理操作,在上一次匹配之后将模式与文本的其余部分进行匹配。然后,列表由在模式匹配的每个应用程序期间匹配的所有文本形成。
答
如果你真的必须使用split
,你可以做:
grep {length > 0} split(/(..)/, $string);
但我认为最快的方式将与unpack
:
unpack("(A2)*", $string);
这两种方法有“优势”是如果字符串有奇数个字符,它将自行输出最后一个字符。
答
其实,赶上奇的性格,你想第二个字符可选:
@array = ($string =~ m/..?/g);
答
传递给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;
由于它看起来像他正在处理十六进制字符,所以这是一个模拟点,但A只适用于ASCII字符。分割应该适用于任何编码,但是您可能想要在正则表达式中添加/ s,因此“\ n”将与“。”匹配。 – 2009-04-28 21:34:27
应该是`a2`,而不是`A2`。前者剥去了空白,这是多余的。 – ikegami 2011-05-19 16:28:59