这段代码中有一些我不知道的有趣行为,其他答案中也没有提到。a on 正则表达式通常会发生的情况split
是,您要拆分的字符会从结果中省略。但是,似乎如果您在正则表达式中捕获了括号,则捕获的材料将保留在结果中。
脚本
#!/usr/bin/env perl
use strict;
use warnings;
my @array1 = ("0", "23", "1", "4", "65", "7");
my $j = join("", @array1);
my $k;
my $k1;
my @ar;
print "Join [$j]\n";
$k = 1;
$k1 = 0;
printf "%-25s", "Version 1 /($k|$k1)/:";
@ar = split(/($k|$k1)/, $j);
print "[", join(";", @ar), "]\n";
printf "%-25s", "Version 2 /($k|$k1)/:";
$k = "1";
$k1 = "0";
@ar = split(/($k|$k1)/, $j);
print "[", join(";", @ar), "]\n";
printf "%-25s", "Version 3 /[01]/:";
@ar = split(/[01]/, $j);
print "[", join(";", @ar), "]\n";
printf "%-25s", "Version 4 /(0|1)/:";
@ar = split(/(0|1)/, $j);
print "[", join(";", @ar), "]\n";
printf "%-25s", "Version 5 /0|1/:";
@ar = split(/0|1/, $j);
print "[", join(";", @ar), "]\n";
printf "%-25s", "Version 6 /([46])/:";
@ar = split(/([46])/, $j);
print "[", join(";", @ar), "]\n";
printf "%-25s", "Version 7 /(?:[46])/:";
@ar = split(/(?:[46])/, $j);
print "[", join(";", @ar), "]\n";
输出
Join [02314657]
Version 1 /(1|0)/: [;0;23;1;4657]
Version 2 /(1|0)/: [;0;23;1;4657]
Version 3 /[01]/: [;23;4657]
Version 4 /(0|1)/: [;0;23;1;4657]
Version 5 /0|1/: [;23;4657]
Version 6 /([46])/: [0231;4;;6;57]
Version 7 /(?:[46])/: [0231;;57]
如您所见,当拆分字符串的正则表达式中存在捕获括号时,将保留(捕获的)拆分字符。当括号丢失或显式非捕获(版本 7)时,不保留拆分字符。
而且,如果您仔细阅读手册,split
说明确实包含以下段落:
如果 PATTERN 包含捕获组,则对于每个分隔符,为组捕获的每个子字符串生成一个附加字段(按照指定组的顺序,根据反向引用;如果任何组不匹配,则它捕获undef
值而不是子字符串。另外,请注意,只要有分隔符(即,每当发生拆分时),就会产生任何此类附加字段,并且此类附加字段不计入 LIMIT。
接下来是一些例子。
在 Mac OS X 10.7.5 上使用 Perl 5.16.0 进行测试。