2010-04-20 41 views
6

一个共同的“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 podPerl 5.12 pack tutorialthe 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"; 
} 

回答

9

packunpack模板可以使用括号组东西很像正则表达式即可。该组可以跟随重复计数。作为重复计数的*意味着“重复,直到你用完东西打包/解包”。

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

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

+0

我知道它必须简单!现在我玩了,'“(A1)*”'将glob(我的问题)和'“(A1)$ i”'生成$ i字段。桃色!你知道在哪里被记录在一个好方法吗?网络上的大多数资料并不好... – dawg 2010-04-20 19:12:22

+0

@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

+0

@其他:perldoc中的示例在此没有对我说话案件。 “*”的大部分用法都是“吞噬其余”的形式,如在“解压”a3/A * *,'007 Bond J'中一样。 ('Bond','J')',我认为perldoc在pack/unpack上可能会更清晰... – dawg 2010-04-20 19:21:16

相关问题