一般的な「Perlism」は、次の形式でループするものとしてリストを生成しています。
for($str=~/./g) { print "the next character from \"$str\"=$_\n"; }
この場合、グローバルマッチの正規表現は文字列から順番に 1 文字のリストを返し、$str
その値を$_
正規表現の代わりにsplit
、同じ方法で使用できます または'a'..'z'
、map
など.
unpack
文字列のフィールド解釈でフィールドを生成することを検討しています。私はいつもunpack
、自分の脳の働きがそれほど単純ではないことに気づきました。そして、そこまで深く掘り下げたことはありません。
簡単なケースとして、unpack を使用して文字列から各要素に 1 文字のリストを生成したいと考えています (はい -- できることはわかっていますが、unpack がこのように使用できるかどうかsplit(//,$str)
を/./g
本当に知りたい.. .)
明らかに、アンパックにフィールド リストを使用できますが、unpack("A1" x length($str), $str)
グロビングのように見える他の方法はありますか? つまり、unpack(some_format,$str)
$str が使い果たされるまで unpack がフォーマット グループ内の次の文字グループを返すように、リスト コンテキストまたはループ内で呼び出すことはできますか?
The Perl 5.12 Pack podと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";
}