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
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.
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.
En fait, pour attraper le caractère Impair, vous voulez rendre le second caractère facultatif:
@array = ( $string =~ m/..?/g );
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;