split /PATTERN/,EXPR
私は本の中で次のことを読みました、
スプリットでパターンを使用する場合、これらはセパレーター保持モードをトリガーするため、パターン内のメモリーパラメーターは避けてください。
これを詳細に説明しているドキュメントが見つからないようです。誰かがセパレータ保持モードとその可能な使用法を簡単に説明してもらえますか?
これは最後に文書化されperldoc -f split
ています(コード内の解説は私自身のものです):
キャプチャグループが含まれている場合、
PATTERN
セパレータごとに、グループによってキャプチャされたサブストリングごとに追加のフィールドが生成されます(後方参照に従って、グループが指定された順序で)。いずれかのグループが一致しない場合undef
、サブストリングの代わりに値をキャプチャします。また、そのような追加フィールドは、セパレーターがあるときはいつでも(つまり、分割が発生するときはいつでも)生成され、そのような追加フィールドはにカウントされないLIMIT
ことに注意してください。リストコンテキストで評価された次の式を検討してください(返された各リストは、関連するコメントで提供されます)。split(/-|,/, "1-10,20", 3) # ('1', '10', '20') # No retention, '-', ',' consumed split(/(-|,)/, "1-10,20", 3) # ('1', '-', '10', ',', '20') # Split on and retain '-' or ',' # 5 elements returned split(/-|(,)/, "1-10,20", 3) # ('1', undef, '10', ',', '20') # undef because '-' matches split(/(-)|,/, "1-10,20", 3) # ('1', '-', '10', undef, '20') # undef because ',' matches split(/(-)|(,)/, "1-10,20", 3) # ('1', '-', undef, '10', undef, ',', '20') # one match per capturing group. (-) matches -, but # (,) returns undef on trying to match -. # 7 elements (!)
だから、不注意をキャッチするかもしれない2つの興味深い癖:
キャプチャグループが一致しない場合は常にリストコンテキストでsが生成undef
されますが、他の何かが一致PATTERN
します
LIMIT
として指定してキャプチャグループで分割する$n
と、結果のリストに複数の$n
要素が含まれる場合があります
これは、逆参照を生成する括弧付きの正規表現を使用する場合、一致した区切り文字が保持され、分割された値とともにリストに返されることを意味します。