一个常见的“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 pod和Perl 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";
}