在Perl中,如何将字符串拆分为每两个字符的块?

ipakzgxi  于 2022-11-15  发布在  Perl
关注(0)|答案(5)|浏览(241)

我如何在Perl中获取一个字符串,并将其拆分成一个数组,每个数组包含两个字符长的条目?
我尝试过:

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

但没有达到预期的效果。
最终我想把这样的东西

F53CBBA476

中的数组,该数组包含

F5 3C BB A4 76
jgwigjjp

jgwigjjp1#

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

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

jhiyze9q

jhiyze9q2#

如果您确实必须使用split,可以执行以下操作:

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

但我认为最快的方法是使用unpack

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

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

fcwjkofz

fcwjkofz3#

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

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

oxcyiej74#

传递给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;
k3bvogb1

k3bvogb15#

我看到了一种更直观(虽然可能效率较低)的方法来解决这个问题:使用“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($_));}

运行那个,看看它打印了什么。:-)

相关问题