6

一般的な「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 podPerl 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";
}
4

1 に答える 1

9

packテンプレートでは、unpack正規表現と同じように括弧を使用してグループ化できます。グループの後に繰り返しカウントを続けることができます。 *リピートカウントとは、「パック/アンパックするものがなくなるまで繰り返す」ことを意味します。

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

これらのどれが最速であるかを見つけるためにベンチマークを実行する必要があります。

于 2010-04-20T19:02:50.920 に答える