5
split /PATTERN/,EXPR

私は本の中で次のことを読みました、

スプリットでパターンを使用する場合、これらはセパレーター保持モードをトリガーするため、パターン内のメモリーパラメーターは避けてください。

これを詳細に説明しているドキュメントが見つからないようです。誰かがセパレータ保持モードとその可能な使用法を簡単に説明してもらえますか?

4

2 に答える 2

7

これは最後に文書化され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要素が含まれる場合があります

于 2012-09-19T18:46:36.600 に答える
1

これは、逆参照を生成する括弧付きの正規表現を使用する場合、一致した区切り文字が保持され、分割された値とともにリストに返されることを意味します。

于 2012-09-19T18:52:21.110 に答える