0
Help us understand the problem. What are the problem?

posted at

updated at

メモ: Perl、split /(((regexp)))/ したらダメ

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 の動作がどういうものなのか分からないからどうしてこうなるのかは分からない。何にしても直観に反する結果だから奇妙としか思えない。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?