web-dev-qa-db-fra.com

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

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
34
Jax
@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.

55
Bill Karwin

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.

39
mat

En fait, pour attraper le caractère impair, vous voulez rendre le deuxième caractère facultatif:

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

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;
5
ikegami