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
するものを識別します。分割を使用したい場合は、次のようなものを使用します
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;