Могу ли я использовать unpack для разделения строки на символы в Perl? - PullRequest
6 голосов
/ 20 апреля 2010

Обычный 'Perlism' генерирует список как цикл, который можно перебрать в следующей форме:

for($str=~/./g) { print "the next character from \"$str\"=$_\n"; }

В этом случае регулярное выражение глобального соответствия возвращает список, который на один символ по очереди от строки $str, и присваивает это значение $_

Вместо регулярного выражения split можно использовать таким же образом или 'a'..'z', map и т. Д.

Я исследую unpack, чтобы сгенерировать поле интерпретацией строки полем. Я всегда считал unpack менее простым в отношении того, как работает мой мозг, и я никогда не углублялся в это глубоко.

В качестве простого случая я хочу создать список, состоящий из одного символа в каждом элементе из строки, используя unpack (да - я знаю, что могу сделать это с split(//,$str) и /./g, но я действительно хочу увидеть если распаковать можно таким способом ...)

Очевидно, что я могу использовать список полей для распаковки, который является unpack("A1" x length($str), $str), но есть ли какой-то другой способ, который выглядит как глобализация? т.е. я могу вызвать unpack(some_format,$str) либо в контексте списка, либо в цикле, так что unpack будет возвращать следующую группу символов в группе форматирования до тех пор, пока не будет исчерпан $ str?

Я прочитал Пакет Perl 5.12 Pack и Perl 5.12 pack учебник и Perkmonks учебник

Вот пример кода:

#!/usr/bin/perl
use warnings;
use strict;

my $str=join('',('a'..'z', 'A'..'Z')); #the alphabet...  

$str=~s/(.{1,3})/$1 /g;                #...in groups of three
print "str=$str\n\n";

for ($str=~/./g) { 
 print "regex: = $_\n";
}

for(split(//,$str)) {
 print "split: \$_=$_\n";
}

for(unpack("A1" x length($str), $str)) {
 print "unpack: \$_=$_\n";
}

1 Ответ

9 голосов
/ 20 апреля 2010
Шаблоны

pack и unpack могут использовать круглые скобки для группировки таких вещей, как регулярные выражения. Группа может сопровождаться повторным подсчетом. * в качестве счетчика повторений означает «повторять, пока у вас не закончились вещи для упаковки / распаковки».

for(unpack("(A1)*", $str)) {
    print "unpack: \$_=$_\n";
}

Вам нужно будет запустить тест, чтобы узнать, какой из них самый быстрый.

...