结果包含空字符串时在perl中拆分的奇怪行为

时间:2014-09-18 02:29:32

标签: perl split

这是我的perl 5.16代码

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

如果我在其中输入一个文件:

paaaa
paaaaq

我得到了

p
pbbbbq

但我期待

pbbbb
pbbbbq

为什么我不期待后一种行为?

3 个答案:

答案 0 :(得分:7)

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

  

如果LIMIT被省略(或等效地为零),那么它通常被视为相反为负,但除了尾随空字段被剥离(空白前导字段始终保留)

你想要

split /a/, $_, -1;

答案 1 :(得分:7)

查看split perldoc中的LIMIT参数:

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

相关部分是:

  

如果LIMIT为负数,则将其视为任意大;尽可能多的领域。

     

如果省略LIMIT(或等效地为零),则通常将其视为负值,但除去尾随的空字段(始终保留空的前导字段);如果所有字段都为空,则认为所有字段都是尾随的(因此在这种情况下会被删除)。

为了获得您期望的行为,请尝试:

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

答案 2 :(得分:3)

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

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