2010-04-20 30 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

相關問題