2010-04-20 13 views
6

Powszechnym „Perlism” generuje listę jako coś do pętli przez ten formularz:Czy mogę użyć polecenia rozpakuj, aby podzielić ciąg znaków na znaki w Perlu?

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

W tym przypadku globalny mecz regex zwraca listę, która jest o jeden znak z kolei z łańcucha $str, i przypisuje tę wartość do $_

Zamiast regex, split mogą być używane w ten sam sposób lub 'a'..'z', map itp

jestem w śledzenie unpack w celu wygenerowania interpretacji ciągu za pomocą pola. Zawsze uważałem, że unpack nie jest tak proste, jak działa mój mózg i nigdy tak naprawdę nie wkopałem się w to głęboko.

Jako prosty przypadek, chcę wygenerować listę, która jest jeden znak w każdym elemencie z ciągu za pomocą rozpakowywania (tak - wiem, że mogę to zrobić z split(//,$str) i /./g, ale naprawdę chcę zobaczyć, czy można rozpakować być użyty w ten sposób ...)

Oczywiście, mogę użyć listy pól do rozpakowania, która jest unpack("A1" x length($str), $str), ale czy istnieje inny sposób, który wygląda na globbing? tzn. czy mogę wywołać unpack(some_format,$str) w kontekście listowym lub w pętli tak, że rozpakowanie zwróci następną grupę znaków w grupie formatu, dopóki nie zostanie wyzerowany $ str?

Czytałem The Perl 5.12 Pack pod i Perl 5.12 pack tutorial i the Perkmonks tutorial

Oto przykładowy 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"; 
} 

Odpowiedz

9

pack i unpack szablony można użyć nawiasów do rzeczy grupowych podobnie jak wyrażenia regularne mogą. Po grupie może następować liczba powtórzeń. * jako liczba powtórzeń oznacza "powtarzaj, aż zabraknie rzeczy do spakowania/rozpakowania".

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

Będziesz musiał przeprowadzić test porównawczy, aby dowiedzieć się, który z nich jest najszybszy.

+0

Wiedziałem, że to musi być proste !!! Teraz, kiedy gram z nim, "" (A1) * "' będzie glob (moje pytanie) i "" (A1) $ i "' wygeneruje pola $ i. Aksamitny! Czy wiesz, gdzie jest to udokumentowane w dobry sposób? Większość materiałów w sieci nie była wspaniała ... – dawg

+0

@drewk: in 'perldoc -f pack' (http://perldoc.perl.org/functions/pack.html) w" Dostarczanie * liczby powtórzeń zamiast liczby oznacza użycie, ale pozostało wiele pozycji ... "i" grupa A() jest pod-szablonem zawartym w nawiasach ... " – Ether

+0

@Ether: przykłady w perldoc nie mówiły do ​​mnie w tym walizka. Większość zastosowań '*' miało formę "pożarcia reszty" jak w 'rozpakowaniu' a3/A A * ',' 007 Bond J '; daje ('Bond', 'J') 'i myślę, że perldoc na opakowaniu/rozpakowaniu może być - jaśniej ... – dawg

Powiązane problemy