Perlで文字列を取得して、それぞれ2文字のエントリを持つ配列に分割するにはどうすればよいですか?
私はこれを試みました:
@array = split(/../, $string);
期待した結果が得られませんでした。
最終的にはこういうものにしたい
F53CBBA476
含む配列に
F5 3C BB A4 76
@array = ( $string =~ m/../g );
パターンマッチング演算子は、Perlのリストコンテキストで特別な方法で動作します。それは操作を繰り返し処理し、前回の一致後の残りのテキストに対してパターンを照合します。次に、パターンマッチングの各適用中に一致したすべてのテキストからリストが形成されます。
split
を本当に使用する必要がある場合は、次のようにできます。
grep {length > 0} split(/(..)/, $string);
しかし、私はunpack
を使用するのが最も速いと思います:
unpack("(A2)*", $string);
これらの両方の方法には、文字列の文字数が奇数の場合、最後の文字が独自に出力されるという「利点」があります。
実際には、奇妙な文字をキャッチするには、2番目の文字をオプションにします。
@array = ( $string =~ m/..?/g );
split
に渡されるパターンは、必要なseparatesを識別します。スプリットを使用したい場合は、次のようなものを使用します
my @pairs = split /(?(?{ pos() % 2 })(?!))/, $string;
または
my @pairs = split /(?=(?:.{2})+\z)/s, $string;
これらはかなり貧弱なソリューションです。より良いソリューションは次のとおりです。
my @pairs = $string =~ /..?/sg; # Accepts odd-length strings.
my @pairs = $string =~ /../sg;
my @pairs = unpack '(a2)*', $string;