2010-04-20 13 views
6

Yaygın bir 'Perlism' Bu formdaki döngüye şey olarak bir liste üzerinde oluşturuyor: Bu durumdaBir dizeyi Perl'deki karakterlere bölmek için paketi açabilir miyim?

for($str=~/./g) { print "the next character from \"$str\"=$_\n"; }

küresel maç regex dize $str dan sırayla bir karakterdir bir listesini döndürür, ve ben olduğumu $_

yerine regex ait

, split aynı şekilde kullanılabilir veya 'a'..'z', map değer, vb

atar Bir dizgenin alan yorumuna göre bir alan oluşturmak için unpack numaralı kazıma. Beynimin çalışma şekline daha az açık olmak için her zaman unpack'u buldum ve bunu hiç bu kadar derinden kazmadım.

Basit bir örnek olarak, açmayı kullanarak bir dizeden her öğede bir karakter olan bir liste oluşturmak istiyorum (evet - split(//,$str) ve /./g ile yapabileceğimi biliyorum, ancak paketin açılıp açılmayacağını gerçekten görmek istiyorum. Bu şekilde kullan ...)

Açıkçası, unpack("A1" x length($str), $str) paketini açmak için bir alan listesi kullanabilirim, ancak başka şekilde globbing gibi görünüyor mu? Örneğin, liste bağlamında unpack(some_format,$str) numaralı telefonu arayabilir miyim veya bir döngü içinde, paketin sonraki karakter grubunu $ str bitene kadar format grubunda döndürebilir miyim?

Ben The Perl 5.12 Pack pod okudum ve Perl 5.12 pack tutorial ve the Perkmonks tutorial

İşte örnek kod:

#!/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"; 
} 

cevap

9

pack ve unpack şablonları çok regexpleri can gibi grup şeyler parantez kullanabilirsiniz. Grup tekrar sayısı ile takip edilebilir. Bir tekrar sayısı olarak *, "paketlemek/açmak için bir şeyler bitene kadar tekrarla" anlamına gelir.

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

Bunlardan hangisinin en hızlı olduğunu bulmak için bir referans noktası çalıştırmanız gerekir.

+0

Basit olması gerektiğini biliyordum! Şimdi onunla oynayacağım, "(A1) *" '(soru) ve (") "(A1) $ i" ($) alanlarını oluşturacak. Harikayız! Bunun iyi bir şekilde belgelendiğini biliyor musunuz? Web'deki malzemelerin çoğu büyük değildi ... – dawg

+0

@drewk: "perldoc -f paketinde" (http://perldoc.perl.org/functions/pack.html) "Tekrar sayımı için bir * sağlama bir sayı yerine kullanmak yerine birçok öğe kalıyor ... "ve" A() -grubu parantez içine alınmış bir alt-ŞABLON ... " – Ether

+0

@Ether: Perldoc'taki örnekler bu konuda benimle konuşmadı vaka. '' 'Nin çoğunun kullanımı 'a3/A A *', '007 Bond J' paketini açarken olduğu gibi 'geri kalanı gobble' biçimindeydi; verir ('Bond', 'J') 've paketin/paketin üzerindeki perldoc'un daha açık olabileceğini düşünüyorum - daha açık ... – dawg

İlgili konular