当结果包括空字符串时,在perl中使用split的奇怪行为



这是我的perl 5.16代码

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

如果我输入一个包含以下内容的文件:

paaaa
paaaaq

我得到

p
pbbbbq

但我期待

pbbbb
pbbbbq

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

有文献记载,除非指定第三个非零参数,否则会删除尾随的空值。

如果LIMIT被省略(或者,等价地,为零),那么它通常被视为负,但后面的空字段被剥离(总是保留空的前导字段)除外

你想要

split /a/, $_, -1;

查看拆分perldoc:中的LIMIT参数

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

相关章节为:

如果LIMIT为负,则将其视为任意大;产生尽可能多的场。

如果LIMIT被省略(或者,等价地,为零),那么它通常被视为负,但后面的空字段被剥离(总是保留空的前导字段)除外;如果所有字段都是空的,那么所有字段都被认为是尾随的(因此在这种情况下被剥离)。

因此,要获得您期望的行为,请尝试:

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

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

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

最新更新