[英]How can I split a string into chunks of two characters each in 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;
我看到了一种更直观(如果效率可能较低)的方法来解决这个问题:使用“substr”从字符串中切出所需的 2 个字符的字符串,并使用“push”将它们推送到数组中:
# Start with a string (a hex number in this case):
my $string = "526f62626965204861746c6579";
# Declare an array to hold the desired 2-char snippets:
my @array;
# Snip snippets from string and put in array:
while ($string) {push @array, substr($string,0,2,"");}
# Say, those look like ASCII codes, don't they?
for (@array) {print chr(hex($_));}
运行它并查看它打印的内容。 :-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.