Jax*_*Jax 32 regex arrays perl split
如何在Perl中获取一个字符串并将其拆分为一个数组,每个数组的长度为两个字符?
我试过这个:
@array = split(/../, $string);
Run Code Online (Sandbox Code Playgroud)
但没有得到预期的结果.
最终我想转变这样的事情
F53CBBA476
Run Code Online (Sandbox Code Playgroud)
在包含的数组中
F5 3C BB A4 76
Run Code Online (Sandbox Code Playgroud)
Bil*_*win 54
@array = ( $string =~ m/../g );
Run Code Online (Sandbox Code Playgroud)
模式匹配运算符在Perl的列表上下文中以特殊方式运行.它迭代地处理操作,将模式与上一次匹配后的文本的其余部分进行匹配.然后,列表由在模式匹配的每个应用期间匹配的所有文本形成.
mat*_*mat 37
如果你真的必须使用split,你可以做一个:
grep {length > 0} split(/(..)/, $string);
Run Code Online (Sandbox Code Playgroud)
但我认为最快的方法是unpack:
unpack("(A2)*", $string);
Run Code Online (Sandbox Code Playgroud)
这两种方法都具有"优势",即如果字符串具有奇数个字符,则它将自己输出最后一个字符.
小智 6
实际上,要捕获奇数字符,您需要使第二个字符可选:
@array = ( $string =~ m/..?/g );
Run Code Online (Sandbox Code Playgroud)
该模式传递给split识别哪些分离是你想要的.如果你想使用split,你会使用类似的东西
my @pairs = split /(?(?{ pos() % 2 })(?!))/, $string;
Run Code Online (Sandbox Code Playgroud)
要么
my @pairs = split /(?=(?:.{2})+\z)/s, $string;
Run Code Online (Sandbox Code Playgroud)
那些是相当差的解决方案.更好的解决方案包
my @pairs = $string =~ /..?/sg; # Accepts odd-length strings.
my @pairs = $string =~ /../sg;
my @pairs = unpack '(a2)*', $string;
Run Code Online (Sandbox Code Playgroud)