35

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

私はこれを試みました:

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

しかし、期待した結果は得られませんでした。

最終的にはこのようなものを回したい

F53CBBA476

を含む配列に

F5 3C BB A4 76
4

4 に答える 4

59
@array = ( $string =~ m/../g );

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

于 2008-12-16T19:29:49.670 に答える
41

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

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

しかし、最速の方法は次のとおりだと思いますunpack

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

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

于 2008-12-16T21:18:35.597 に答える
6

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

@array = ( $string =~ m/..?/g );
于 2008-12-16T22:07:09.337 に答える
5

渡されたパターンは、必要なものを分離splitするものを識別します。分割を使用したい場合は、次のようなものを使用します

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;
于 2011-05-19T16:28:15.277 に答える