Как я могу разбить строку на куски по два символа каждый в Perl? - PullRequest
32 голосов
/ 16 декабря 2008

Как взять строку в Perl и разделить ее на массив с записями длиной два символа каждый?

Я пытался это:

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

но не получил ожидаемых результатов.

В конечном итоге я хочу превратить что-то вроде этого

F53CBBA476

в массив, содержащий

F5 3C BB A4 76

Ответы [ 4 ]

54 голосов
/ 16 декабря 2008
@array = ( $string =~ m/../g );

Оператор сопоставления с образцом ведет себя особым образом в контексте списка в Perl. Он обрабатывает операцию итеративно, сопоставляя шаблон с остальной частью текста после предыдущего соответствия. Затем список формируется из всего текста, который сопоставляется во время каждого применения сопоставления с образцом.

37 голосов
/ 17 декабря 2008

Если вы действительно должны использовать split, вы можете сделать:

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

Но я думаю, что самый быстрый способ был бы с unpack:

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

Оба эти метода имеют «преимущество» в том, что если строка имеет нечетное количество символов, она будет выводить последний самостоятельно.

6 голосов
/ 17 декабря 2008

На самом деле, чтобы поймать нечетный символ, вы хотите сделать второй символ необязательным:

@array = ( $string =~ m/..?/g );
5 голосов
/ 19 мая 2011

Шаблон, переданный в 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;
...