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

Общий 'Perlism' генерирует список как что-то для цикличного выполнения в этой форме:

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

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

Вместо regex, split может использоваться таким же образом или 'a'..'z', map, и т.д.

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

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

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

Я считал переходную приставку Пакета Perl 5.12, и Perl 5.12 упаковывают учебное руководство и учебное руководство 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";
}

6
задан cjm 20 April 2010 в 20:07
поделиться

1 ответ

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

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

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

9
ответ дан 10 December 2019 в 02:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: