このコードには、私が気付いていなかった興味深い動作がいくつかあり、それは他の回答では明らかにされていません。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 に capture groups が含まれている場合、区切り文字ごとに、グループによってキャプチャされた各部分文字列に対して追加のフィールドが生成されます (グループが指定された順序で、後方参照に従ってグループが指定されます。いずれかのグループが一致しない場合は、undef
また、そのような追加のフィールドはセパレーターがある場合 (つまり、分割が発生した場合) に生成され、そのような追加のフィールドは LIMIT にはカウントされないことに注意してください。
いくつかの例が続きます。
Mac OS X 10.7.5 で Perl 5.16.0 を使用してテストしています。