2014-09-18 2 views
2

Это мой Perl 5,16 кодСтранное поведение с расколом в Perl, когда результат включает в себя пустые строки

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

Если я входной файл с этим в нем:

paaaa 
paaaaq 

Я получаю

p 
pbbbbq 

Но я ожидал

pbbbb 
pbbbbq 

Почему я ошибаюсь, чтобы ожидать последнего поведения?

ответ

7

Это documented, что конечные пустоты удаляются, если вы не указали третий, отличный от нуля аргумент.

Если LIMIT опущен (или, что то же самое, ноль), то это, как правило, рассматривается как если бы оно было вместо отрицательным, но за исключением того, что конечные пустые поля раздели (пустые ведущие поля всегда сохраняется)

Вы хотите

split /a/, $_, -1; 
+0

Спасибо, ребята. Я должен был внимательно прочитать документы. –

+3

@ StephenMontgomery-Smith: это сложная документация; единственным оправданием для него является то, что он почти всегда делает то, что вы хотите. – ysth

7

Посмотрите на параметр ЛИМИТ в разделенном perldoc:

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

Соответствующий раздел:

Если LIMIT отрицательно, оно рассматривается как если бы оно было вместо сколь угодно большим; как можно больше полей.

Если LIMIT опущен (или, что равнозначно нулю), то он обычно обрабатывается так, как если бы он был отрицательным, но за исключением того, что завершающие пустые поля лишены (пустые начальные поля всегда сохраняются); если все поля пустые, то все поля считаются завершающими (и, таким образом, лишены в этом случае).

Таким образом, чтобы получить поведение вы ожидаете, попробуйте:

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

Потому что после разделения paaaa, вы получили массив @data, который имеет только один elemet р в нем , Возможно замещение лучше:

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