2008-12-16 11 views

Répondre

52
@array = ($string =~ m/../g); 

L'opérateur de correspondance de modèle se comporte d'une manière particulière dans un contexte de liste en Perl . Il traite l'opération de manière itérative, en faisant correspondre le motif au reste du texte après la correspondance précédente. Ensuite, la liste est formée à partir de tout le texte qui correspond à chaque application de l'appariement.

37

Si vous devez vraiment utiliser split, vous pouvez faire:

grep {length > 0} split(/(..)/, $string); 

Mais je pense que le meilleur moyen serait avec unpack:

unpack("(A2)*", $string); 

Ces deux méthodes ont le « avantage » que Si la chaîne a un nombre impair de caractères, elle sortira la dernière par elle-même.

+0

Comme il semble qu'il travaille avec des caractères hexadécimaux, c'est un peu discutable, mais A ne fonctionne que pour les caractères ASCII. La scission devrait fonctionner pour n'importe quel encodage, mais vous pourriez vouloir ajouter un/s à l'expression rationnelle ainsi "\ n" sera assorti par ".". –

+2

Devrait être 'a2', pas' A2'. Le premier supprime les espaces blancs, ce qui est au mieux superflu. – ikegami

6

En fait, pour attraper le caractère étrange, vous voulez faire le second caractère facultatif:

@array = ($string =~ m/..?/g); 
+1

Oui, mais c'est beaucoup plus lent que de déballer. – mat

5

Le modèle est passé à split identifie ce qui sépare ce que vous voulez. Si vous vouliez utiliser Split, vous utiliseriez quelque chose comme

my @pairs = split /(?(?{ pos() % 2 })(?!))/, $string; 

ou

my @pairs = split /(?=(?:.{2})+\z)/s, $string; 

Ce sont des solutions plutôt pauvres. De meilleures solutions incluent:

my @pairs = $string =~ /..?/sg; # Accepts odd-length strings. 

my @pairs = $string =~ /../sg; 

my @pairs = unpack '(a2)*', $string; 
Questions connexes