5
split /PATTERN/,EXPR

我在一本书中读到以下内容,

split中使用模式时,请务必避免模式中的内存括号,因为这些会触发分隔符保留模式。

我似乎找不到详细解释这一点的文档。有人可以简要解释一下分隔符保留模式及其可能的用法吗?

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 (!)

因此,两个有趣的怪癖可能会引起粗心大意的人:

  • undef每当捕获组不匹配时,列表上下文中的 s 的生成,但其他东西PATTERN

  • 您可以使用捕获组进行拆分,指定LIMIT$n,并且结果列表具有多个$n元素

于 2012-09-19T18:46:36.600 回答
1

这意味着如果您使用带有括号的正则表达式来生成反向引用,那么匹配的分隔符将被保留,并与拆分值一起返回到列表中。

于 2012-09-19T18:52:21.110 回答