当结果包含空字符串时,perl中split的奇怪行为

当结果包含空字符串时,perl中split的奇怪行为,perl,split,Perl,Split,这是我的perl 5.16代码 while(<>) { chomp; @data = split /a/, $_; print(join("b",@data),"\n"); } 我明白了 但我期待着 pbbbb pbbbbq 为什么我认为后一种行为是错误的?除非指定第三个非零参数,否则后面的空格将被删除 如果省略了LIMIT(或等效为零),则通常将其视为负值,但尾部空字段被剥离(始终保留空前导字段) 你想要 split /a/, $_, -1; 查看split pe

这是我的perl 5.16代码

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

但我期待着

pbbbb
pbbbbq
为什么我认为后一种行为是错误的?

除非指定第三个非零参数,否则后面的空格将被删除

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

你想要

split /a/, $_, -1;

查看split perldoc中的LIMIT参数:

有关章节如下:

若极限为负值,则将其视为任意大;生产尽可能多的油田

如果省略了限制(或等效为零),则通常将其视为负值,但尾部空字段被剥离(始终保留空前导字段);如果所有字段都为空,则所有字段都被视为尾随字段(因此在本例中被剥离)

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

while(<>) {
  chomp;
  @data = split /a/, $_, -1;
  print(join("b",@data),"\n");
}
while(){
咀嚼;
@数据=split/a/,$\ 1;
打印(连接(“b”),@data),“\n”);
}
因为在拆分paaaa之后,您得到了一个数组@data,其中只有一个elemet p。 也许替换更好:

while(<>) {
    chomp;
    $_=~s/a/b/g;
    print($_,"\n");
}
while(){
咀嚼;
美元=~s/a/b/g;
打印($);
}

@斯蒂芬蒙哥马利·史密斯:这是一份复杂的文档;唯一的理由是它几乎总是做你想做的事。
while(<>) {
  chomp;
  @data = split /a/, $_, -1;
  print(join("b",@data),"\n");
}
while(<>) {
    chomp;
    $_=~s/a/b/g;
    print($_,"\n");
}