2010-06-02 3 views
2
#!/usr/bin/perl 

use strict; 
use warnings; 

my $s = "sad day 
Good day 
May be Bad Day 
"; 

$s =~ s/\w+ \w+/_/gm; 

print $s; 

Я пытаюсь заменить все пробелы между словами на _, но он не работает. Что не так с этим?Что не так с этой заменой?

ответ

3

замена Эта модель, вероятно, является наиболее эффективным решением:

$a =~ s/\b \b/_/g; 
+0

согласился, она хорошо выглядит; -) – mirod

+3

Пожалуйста, не используйте '$ Ā' или' $ b' в примерах, если это не влечет за [сортировку] (http://perldoc.perl.org/perlvar .html). – Zaid

+0

@ Zaid - Хорошая точка, но я просто использовал те же переменные, что и OP. – amphetamachine

5

Подстановка заменяет целое слово (\w+), то пространство затем другое слово подчеркивания.

Там действительно нет необходимости заменить (или захват для того, что имеет значение) эти слова

$a=~s/\b +\b/_/gm; 

заменит перерыв слова (\b, нулевую шириной перехода между словом и неустановленным словом), а затем одно или несколько пробелов, за которым следует другой разрыв слова, под знаком подчеркивания. Использование \b гарантирует, что вы не замените пробел после или до новой строки.

+2

Пожалуйста, не используйте примеры '$ a' или' $ b', если это не связано с [сортировкой] (http://perldoc.perl.org/perlvar.html). – Zaid

+0

'$ a' был использован в вопросе (и в вашем ответе!). Для зрителей здесь «$ a» и «$ b» «предварительно объявлены» в Perl, поэтому вы можете использовать его в подпрограммах сортировки под строкой. Я никогда не был уверен, почему это испортило их использование в любом другом месте. – mirod

+0

Я вижу, откуда вы взяли '$ a', похоже, что Час позаботился об этом. И я мог бы поклясться, что использовал '$ s'! ;) – Zaid

2

Этот вопрос не был бы полным без ответа с участием явно look-ahead and look-behind assertions:

$s =~ s/(?<=\w) (?=\w+)/_/g 
  • Это фактически то же самое, как и решения, связанных с нулевой шириной слова-границей якоря, \b.

  • Обратите внимание, что регулярные выражения могут соответствовать регулярным выражениям любой длины символов, но регулярные выражения look-behind должны иметь фиксированную длину (поэтому (?<=\w+) не может быть выполнено).

+0

+1. Я никогда не использовал так много ожиданий и взглядов. Благодарю. –

+0

Ну, вам тоже не нужно '+' в lookahead. Чтобы компенсировать это, вы пропустили символ '+' после символа пробела;) – SvenS

Смежные вопросы