perlsplit()中的分隔符保留模式


split /PATTERN/,EXPR

我在一本名叫的书中读到了以下内容

split中使用模式时,请确保避免内存异常在模式中,因为这些触发了分离器保留模式。

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

这在perldoc -f split中记录了下来(在代码注释中是我自己的):

如果PATTERN包含捕获组,则对于每个分离器,为组捕获的每个子字符串生成一个附加字段(按照指定组的顺序,根据backreferences);如果任何组不匹配,则捕获undef值而不是子字符串。此外,请注意,任何此类只要存在分离器(即,每当发生拆分时),并且这样的附加字段不计数朝向CCD_ 4。考虑中计算的以下表达式列表上下文(每个返回的列表都在关联的评论):

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

因此,两个有趣的怪癖可能会让粗心的人措手不及:

  • 每当捕获组不匹配时,在列表上下文中生成undefs,但PATTERN中的其他内容会进行

  • 您可以使用一个捕获组进行拆分,将LIMIT指定为$n,生成的列表包含多个$n元素

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

最新更新