Как я могу разделить строку на куски двух символов на Perl?
Как взять строку в Perl и разделить ее на массив с двумя символами длиной каждый?
Я попытался это сделать:
@array = split(/../, $string);
но не получили ожидаемых результатов.
В конечном итоге я хочу сделать что-то вроде этого
F53CBBA476
в массив, содержащий
F5 3C BB A4 76
Ответы
Ответ 1
@array = ( $string =~ m/../g );
Оператор соответствия шаблону ведет себя особым образом в контексте списка в Perl. Он обрабатывает операцию итеративно, сопоставляя шаблон с остальной частью текста после предыдущего совпадения. Затем список формируется из всего текста, который был согласован во время каждого применения сопоставления с образцом.
Ответ 2
Если вы действительно должны использовать split
, вы можете сделать:
grep {length > 0} split(/(..)/, $string);
Но я думаю, что самый быстрый способ был бы с unpack
:
unpack("(A2)*", $string);
Оба эти метода имеют "преимущество" в том, что если строка имеет нечетное число символов, она выведет последнюю из них.
Ответ 3
Собственно, чтобы поймать нечетный символ, вы хотите сделать второй символ необязательным:
@array = ( $string =~ m/..?/g );
Ответ 4
Образец, переданный в split
, идентифицирует то, что отделяет то, что вы хотите. Если вы хотите использовать split, вы бы использовали что-то вроде
my @pairs = split /(?(?{ pos() % 2 })(?!))/, $string;
или
my @pairs = split /(?=(?:.{2})+\z)/s, $string;
Это довольно плохие решения. Лучшие решения включают:
my @pairs = $string =~ /..?/sg; # Accepts odd-length strings.
my @pairs = $string =~ /../sg;
my @pairs = unpack '(a2)*', $string;