Comment puis-je diviser une chaîne en morceaux de deux caractères chacun en Perl?

Comment puis-je prendre une chaîne en Perl et la diviser en un tableau avec des entrées de deux caractères chacune?

J'ai essayé ceci:

@array = split(/../, $string);

, Mais n'a pas obtenu les résultats escomptés.

En fin de compte, je veux transformer quelque chose comme ça

F53CBBA476

Dans un tableau contenant

F5 3C BB A4 76
32
demandé sur hippietrail 2008-12-16 22:24:04

4 réponses

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

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

53
répondu Bill Karwin 2009-01-21 18:25:51

Si vous devez vraiment utiliser split, vous pouvez faire un :

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

, Mais je pense que le moyen le plus rapide serait avec unpack :

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

Ces deux méthodes ont l '"avantage" que si la chaîne a un nombre impair de caractères, elle affichera la dernière seule.

37
répondu mat 2013-04-01 04:25:39

En fait, pour attraper le caractère Impair, vous voulez rendre le second caractère facultatif:

@array = ( $string =~ m/..?/g );
6
répondu ChrisD 2008-12-16 22:07:09

Le modèle adopté pour split identifie 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 médiocres. Les meilleures solutions incluent:

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

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

my @pairs = unpack '(a2)*', $string;
5
répondu ikegami 2011-05-19 16:28:15