web-dev-qa-db-ja.com

Perlで文字列を2つの文字のチャンクに分割するにはどうすればよいですか?

Perlで文字列を取得して、それぞれ2文字のエントリを持つ配列に分割するにはどうすればよいですか?

私はこれを試みました:

@array = split(/../, $string);

期待した結果が得られませんでした。

最終的にはこういうものにしたい

F53CBBA476

含む配列に

F5 3C BB A4 76
34
Jax
@array = ( $string =~ m/../g );

パターンマッチング演算子は、Perlのリストコンテキストで特別な方法で動作します。それは操作を繰り返し処理し、前回の一致後の残りのテキストに対してパターンを照合します。次に、パターンマッチングの各適用中に一致したすべてのテキストからリストが形成されます。

55
Bill Karwin

splitを本当に使用する必要がある場合は、次のようにできます。

grep {length > 0} split(/(..)/, $string);

しかし、私はunpackを使用するのが最も速いと思います:

unpack("(A2)*", $string);

これらの両方の方法には、文字列の文字数が奇数の場合、最後の文字が独自に出力されるという「利点」があります。

39
mat

実際には、奇妙な文字をキャッチするには、2番目の文字をオプションにします。

@array = ( $string =~ m/..?/g );
6
ChrisD

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;
5
ikegami