【问题标题】:Odd behavior with split in perl when result includes empty strings当结果包含空字符串时,在 perl 中拆分的奇怪行为
【发布时间】:2014-09-18 02:29:31
【问题描述】:

这是我的 perl 5.16 代码

while(<>) {
  chomp;
  @data = split /a/, $_;
  print(join("b",@data),"\n");
}

如果我输入一个包含这个的文件:

paaaa
paaaaq

我明白了

p
pbbbbq

但我期待

pbbbb
pbbbbq

为什么我期望后一种行为是错误的?

【问题讨论】:

    标签: perl split


    【解决方案1】:

    documented 除非您指定第三个非零参数,否则将删除尾随空。

    如果LIMIT 被省略(或等效为零),则通常将其视为负数,但尾随的空字段被剥离(始终保留空的前导字段)

    你想要

    split /a/, $_, -1;
    

    【讨论】:

    • @StephenMontgomery-Smith:这是一个复杂的文档;唯一的借口是它几乎总是做你想做的事。
    【解决方案2】:

    看一下split perldoc中的LIMIT参数:

    http://perldoc.perl.org/functions/split.html

    相关部分是:

    如果 LIMIT 为负数,则将其视为任意大;生成尽可能多的字段。

    如果 LIMIT 被省略(或等效为零),则通常将其视为负数,但尾随空字段被剥离(始终保留空前导字段)除外;如果所有字段都为空,则所有字段都被视为尾随(因此在这种情况下被剥离)。

    所以要获得您期望的行为,请尝试:

    while(<>) {
      chomp;
      @data = split /a/, $_, -1;
      print(join("b",@data),"\n");
    }
    

    【讨论】:

      【解决方案3】:

      因为在拆分 paaaa 之后,你得到了一个数组 @data,其中只有一个元素 p。 也许替换更好:

      while(<>) {
          chomp;
          $_=~s/a/b/g;
          print($_,"\n");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-27
        • 2014-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-19
        相关资源
        最近更新 更多