繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM