6

一个常见的“Perlism”正在生成一个列表作为以这种形式循环的东西:

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

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

代替正则表达式,split可以以相同的方式使用 or 'a'..'z',map等。

我正在调查unpack通过对字符串的字段解释生成一个字段。我一直发现unpack我的大脑工作方式不那么直截了当,而且我从来没有真正深入研究过它。

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

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

我已阅读Perl 5.12 Pack podPerl 5.12 pack 教程Perkmonks 教程

这是示例代码:

#!/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";
}
4

1 回答 1

9

pack模板可以像正则unpack表达式一样使用括号对事物进行分组。该组可以跟随重复计数。 *作为重复计数的意思是“重复直到你用完打包/解包的东西”。

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

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

于 2010-04-20T19:02:50.920 回答