【发布时间】:2010-09-27 04:58:15
【问题描述】:
如何在 Perl 中获取一个字符串并将其拆分为一个数组,其中每个条目有两个字符长?
我试过这个:
@array = split(/../, $string);
但没有得到预期的结果。
最终我想变成这样的东西
F53CBBA476
放入包含
的数组中F5 3C BB A4 76
【问题讨论】:
如何在 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);
这两种方法都有一个“优点”,如果字符串有奇数个字符,它会自己输出最后一个。
【讨论】:
a2,而不是A2。前者去除尾随空格,这充其量是多余的。
实际上,要捕获奇数字符,您需要将第二个字符设为可选:
@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;
【讨论】:
F5 3C BBA 476