一个常见的'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 tutorial和the 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";
}
答案 0 :(得分:9)
pack
和unpack
模板可以使用括号将事物分组,就像正则表达式一样。该组后面可以重复计数。 *
作为重复计数意味着“重复,直到你用完包装/解包装的东西”。
for(unpack("(A1)*", $str)) {
print "unpack: \$_=$_\n";
}
你必须运行一个基准来找出哪一个是最快的。