35

如何在 Perl 中获取一个字符串并将其拆分为一个数组,其中每个条目有两个字符长?

我试过这个:

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

但没有得到预期的结果。

最终我想变成这样

F53CBBA476

在包含的数组中

F5 3C BB A4 76
4

4 回答 4

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

模式匹配运算符在 Perl 的列表上下文中以一种特殊的方式运行。它迭代地处理操作,将模式与上一次匹配后的文本剩余部分进行匹配。然后列表由在每次应用模式匹配期间匹配的所有文本形成。

于 2008-12-16T19:29:49.670 回答
41

如果你真的必须使用split,你可以做一个:

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

但我认为最快的方法是unpack

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

这两种方法都有一个“优点”,如果字符串有奇数个字符,它将自己输出最后一个。

于 2008-12-16T21:18:35.597 回答
6

实际上,要捕捉奇数字符,您需要将第二个字符设为可选:

@array = ( $string =~ m/..?/g );
于 2008-12-16T22:07:09.337 回答
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;
于 2011-05-19T16:28:15.277 回答