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

Ani*_*han 5 perl split

split /PATTERN/,EXPR
Run Code Online (Sandbox Code Playgroud)

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

分割中使用模式时,请确保避免模式中的内存分配,因为这些触发分离器保留模式.

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

Zai*_*aid 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 (!)
Run Code Online (Sandbox Code Playgroud)

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

  • undef每当捕获组不匹配时,在列表上下文中生成s,但其他内容PATTERN确实存在

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