我可以使用unpack将字符串拆分为Perl中的字符吗?

时间:2010-04-20 18:51:30

标签: perl unpack

一个常见的'Perlism'正在生成一个列表,以此形式循环:

for($str=~/./g) { print "the next character from \"$str\"=$_\n"; }

在这种情况下,全局匹配正则表达式从字符串$str依次返回一个依次为一个字符的列表,并将该值赋给$_

而不是正则表达式,split可以以相同的方式使用,或'a'..'z'map等。

我正在调查unpack以通过字符串的字段解释生成字段。我总是发现unpack对我的大脑工作方式不太直白,我从来没有真正深入挖掘它。

作为一个简单的例子,我想生成一个列表,该列表是使用unpack从字符串中的每个元素中的一个字符(是的 - 我知道我可以使用split(//,$str)/./g来完成它但是我真的想看看unpack是否可以这样使用......)

显然,我可以使用字段列表来解压缩unpack("A1" x length($str), $str),但是还有其他一些看起来像globbing的方式吗?即,我是否可以在列表上下文或循环中调用unpack(some_format,$str),以便解压缩将返回格式组中的下一组字符,直到$ str被排除?

我已阅读The Perl 5.12 Pack pod以及Perl 5.12 pack tutorialthe Perkmonks tutorial

以下是示例代码:

#!/usr/bin/perl
use warnings;
use strict;

my $str=join('',('a'..'z', 'A'..'Z')); #the alphabet...  

$str=~s/(.{1,3})/$1 /g;                #...in groups of three
print "str=$str\n\n";

for ($str=~/./g) { 
 print "regex: = $_\n";
}

for(split(//,$str)) {
 print "split: \$_=$_\n";
}

for(unpack("A1" x length($str), $str)) {
 print "unpack: \$_=$_\n";
}

1 个答案:

答案 0 :(得分:9)

packunpack模板可以使用括号将事物分组,就像正则表达式一样。该组后面可以重复计数。 *作为重复计数意味着“重复,直到你用完包装/解包装的东西”。

for(unpack("(A1)*", $str)) {
    print "unpack: \$_=$_\n";
}

你必须运行一个基准来找出哪一个是最快的。