#!/usr/bin/perl
use strict;
use warnings;
my $s = "sad day
Good day
May be Bad Day
";
$s =~ s/\w+ \w+/_/gm;
print $s;
Я пытаюсь заменить все пробелы между словами на _, но он не работает. Что не так с этим?Что не так с этой заменой?
#!/usr/bin/perl
use strict;
use warnings;
my $s = "sad day
Good day
May be Bad Day
";
$s =~ s/\w+ \w+/_/gm;
print $s;
Я пытаюсь заменить все пробелы между словами на _, но он не работает. Что не так с этим?Что не так с этой заменой?
замена Эта модель, вероятно, является наиболее эффективным решением:
$a =~ s/\b \b/_/g;
Подстановка заменяет целое слово (\w+
), то пространство затем другое слово подчеркивания.
Там действительно нет необходимости заменить (или захват для того, что имеет значение) эти слова
$a=~s/\b +\b/_/gm;
заменит перерыв слова (\b
, нулевую шириной перехода между словом и неустановленным словом), а затем одно или несколько пробелов, за которым следует другой разрыв слова, под знаком подчеркивания. Использование \b
гарантирует, что вы не замените пробел после или до новой строки.
Пожалуйста, не используйте примеры '$ a' или' $ b', если это не связано с [сортировкой] (http://perldoc.perl.org/perlvar.html). – Zaid
'$ a' был использован в вопросе (и в вашем ответе!). Для зрителей здесь «$ a» и «$ b» «предварительно объявлены» в Perl, поэтому вы можете использовать его в подпрограммах сортировки под строкой. Я никогда не был уверен, почему это испортило их использование в любом другом месте. – mirod
Я вижу, откуда вы взяли '$ a', похоже, что Час позаботился об этом. И я мог бы поклясться, что использовал '$ s'! ;) – Zaid
Этот вопрос не был бы полным без ответа с участием явно look-ahead and look-behind assertions:
$s =~ s/(?<=\w) (?=\w+)/_/g
Это фактически то же самое, как и решения, связанных с нулевой шириной слова-границей якоря, \b
.
Обратите внимание, что регулярные выражения могут соответствовать регулярным выражениям любой длины символов, но регулярные выражения look-behind должны иметь фиксированную длину (поэтому (?<=\w+)
не может быть выполнено).
+1. Я никогда не использовал так много ожиданий и взглядов. Благодарю. –
Ну, вам тоже не нужно '+' в lookahead. Чтобы компенсировать это, вы пропустили символ '+' после символа пробела;) – SvenS
согласился, она хорошо выглядит; -) – mirod
Пожалуйста, не используйте '$ Ā' или' $ b' в примерах, если это не влечет за [сортировку] (http://perldoc.perl.org/perlvar .html). – Zaid
@ Zaid - Хорошая точка, но я просто использовал те же переменные, что и OP. – amphetamachine