Comment prendre une chaîne en Perl et la diviser en un tableau avec des entrées de deux caractères chacune?
J'ai tenté 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
@array = ( $string =~ m/../g );
L'opérateur de filtrage 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 modèle 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 modèle.
Si vous devez vraiment utiliser split
, vous pouvez faire:
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 deuxième caractère facultatif:
@array = ( $string =~ m/..?/g );
Le modèle passé à split
identifie ce que sépare ce que vous voulez. Si vous vouliez utiliser le 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. De meilleures solutions comprennent:
my @pairs = $string =~ /..?/sg; # Accepts odd-length strings.
my @pairs = $string =~ /../sg;
my @pairs = unpack '(a2)*', $string;