2021年11月27日 14時43分
Perl の split
関数のバグなのか仕様なのか、パターンとしてグループ化された表現 /(~)/
を使うと変なことになるのが分かった。
ダメな例
use feature 'say' ;
$_ = 'A-B-C' ;
@_ = split /-/ ; say '0:', map {"[$_]"} @_ ;
@_ = split /(-)/ ; say '1:', map {"[$_]"} @_ ;
@_ = split /((-))/ ; say '2:', map {"[$_]"} @_ ;
@_ = split /(((-)))/ ; say '3:', map {"[$_]"} @_ ;
この出力はこうなる。
0:[A][B][C]
1:[A][-][B][-][C]
2:[A][-][-][B][-][-][C]
3:[A][-][-][-][B][-][-][-][C]
対策
(?:~)
を使うとこの現象は起きない。
use feature 'say' ;
$_ = 'A-B-C' ;
@_ = split /-/ ; say '0:', map {"[$_]"} @_ ;
@_ = split /(?:-)/ ; say '1:', map {"[$_]"} @_ ;
@_ = split /(?:(?:-))/ ; say '2:', map {"[$_]"} @_ ;
@_ = split /(?:(?:(?:-)))/ ; say '3:', map {"[$_]"} @_ ;
この出力はこうなる。
0:[A][B][C]
1:[A][B][C]
2:[A][B][C]
3:[A][B][C]
split
の動作がどういうものなのか分からないからどうしてこうなるのかは分からない。何にしても直観に反する結果だから奇妙としか思えない。