Общий '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";
}
pack
и unpack
шаблоны могут использовать круглые скобки для группировки вещей так же, как регулярные выражения. Группа может сопровождаться подсчетом повторов. *
поскольку счетчик повторов означает «повторять, пока у вас не закончатся вещи для упаковки / распаковки».
for(unpack("(A1)*", $str)) {
print "unpack: \$_=$_\n";
}
Вам нужно будет запустить тест, чтобы выяснить, какой из них самый быстрый.