【问题标题】:Perl split with empty text before/after delimitersPerl 在分隔符之前/之后用空文本拆分
【发布时间】:2021-04-26 09:36:48
【问题描述】:

我注意到 Perl 的 split 命令有一些奇怪的行为,尤其是在我希望结果数组包含空字符串 '' 的情况下,但实际上并没有。

例如,如果我在 string 的末尾(或开头)有一个分隔符,则生成的数组不会有一个空字符串 '' 作为最后一个(或第一个)元素。

例子:

@s = split(/x/, 'axb')

产生2个元素数组['a','b']

@s = split(/x/, 'axbx')

产生相同的数组

@s = split(/x/, 'axbxxxx')

产生相同的数组

但只要我把一些东西放在最后,所有这些空字符串都会作为元素出现:

@s = split(/x/, 'axbxxxxc')

产生一个6元素数组['a','b','','','','c']

如果分隔符在开头,则行为类似。

我希望分隔符之间、之前或之后的空文本总是在拆分中产生元素。谁能向我解释为什么拆分在 Perl 中的行为是这样的?我刚刚在 Python 中尝试了同样的事情,它按预期工作。

注意:Perl v5.8

【问题讨论】:

    标签: perl


    【解决方案1】:

    来自the documentation

    默认情况下,空的前导字段被保留,空的尾随字段被删除。 (如果所有字段都为空,则它们被视为尾随。)

    这解释了您在尾随字段中看到的行为。这通常是有道理的,因为例如,人们通常对尾随空格非常粗心。但是,您可以根据需要获取尾随空白字段:

    split /PATTERN/,EXPR,LIMIT

    如果 LIMIT 为负数,则视为指定了任意大的 LIMIT。

    所以要获取所有尾随的空字段:

    @s = split(/x/, 'axbxxxxc', -1);
    

    (我假设您在查看前导空字段时犯了一个粗心的错误 - 它们肯定被保留了。试试split(/x/, 'xaxbxxxx')。结果大小为 3。)

    【讨论】:

    • 引用文档时,请附上相关文档的链接。这次我给你加了。
    • 哇,我不直接去看文档真是太愚蠢了。是的,你是对的,我在测试前导空格时一定犯了一些粗心的错误,只是再次尝试并发现它们被保留了。感谢您提供关于限制 -1 的说明,这帮助了我!
    • @Roman Stolper:前导空字段仅在特殊 split ' ' 的情况下被丢弃,该特殊split ' ' 在任何空白处拆分。 (另一方面,split / / 遵循正常规则,保留前导空字段并仅在空格字符上拆分。)
    • 好吧,不仅在这种情况下;另一种情况是,当正则表达式与零宽度匹配时,会丢弃前导空字段。有关此问题的讨论,请参阅 perlmonks.org/?node_id=322751