Обычный '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";
}