perl split()中的分隔符保留模式

时间:2012-09-19 18:42:28

标签: perl split

split /PATTERN/,EXPR

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

  

拆分中使用模式时,请务必避免使用内存分配   自从这些触发分离器保留模式以来的模式。

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

2 个答案:

答案 0 :(得分: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 (!)

所以,两个有趣的怪癖可能会让人不知所措:

  • 每当捕获组不匹配时,列表上下文中生成undefPATTERN中的其他内容

  • 您可以使用捕获组进行拆分,将LIMIT指定为$n,并且结果列表包含的内容超过$n

答案 1 :(得分:1)

这意味着如果使用带有括号的正则表达式生成反向引用,则匹配的分隔符将被保留,并在列表中返回,以及拆分值。