【发布时间】:2011-02-10 06:58:21
【问题描述】:
一个常见的“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),以便 unpack 将返回格式组中的下一组字符,直到 $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";
}
【问题讨论】: