一个共同的“Perlism”被以这种形式在生成一个列表的东西循环:我可以使用解压将字符串拆分为Perl中的字符吗?
for($str=~/./g) { print "the next character from \"$str\"=$_\n"; }
在这种情况下,全局匹配正则表达式返回一个列表,又一个字符从字符串$str
,并且将该值分配给$_
代替一个正则表达式的,split
可以以相同的方式使用或'a'..'z'
,map
等
我在指示unpack
通过字段的字段解释来生成字段。我一直发现unpack
对于我的大脑工作方式来说并不那么简单,我从来没有真正深入到这一点。
作为一个简单的例子,我要生成一个列表,是利用解压在字符串中的每个元素的一个字符(是的 - 我知道我可以split(//,$str)
和/./g
做,但我真的想看看是否能解包用这种方法...)
显然,我可以使用一个字段列表解压缩,这是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";
}
我知道它必须简单!现在我玩了,'“(A1)*”'将glob(我的问题)和'“(A1)$ i”'生成$ i字段。桃色!你知道在哪里被记录在一个好方法吗?网络上的大多数资料并不好... – dawg 2010-04-20 19:12:22
@drewk:在'perldoc -f pack'(http://perldoc.perl.org/functions/pack.html)at“Suppating a * for the repeat count而不是数字意味着使用,但是剩下的许多项目......“和”A() - 组是包含在括号中的子模板...“ – Ether 2010-04-20 19:14:49
@其他:perldoc中的示例在此没有对我说话案件。 “*”的大部分用法都是“吞噬其余”的形式,如在“解压”a3/A * *,'007 Bond J'中一样。 ('Bond','J')',我认为perldoc在pack/unpack上可能会更清晰... – dawg 2010-04-20 19:21:16