В Perl, что является хорошим способом выполнить замену строки с помощью регулярного выражения и сохранить значение в другой переменной, не изменяя оригинал?
Я обычно просто копирую строку в новую переменную, а затем связываю ее с s///
регулярным выражением, которое выполняет замену новой строки, но мне было интересно, есть ли лучший способ сделать это?
$newstring = $oldstring;
$newstring =~ s/foo/bar/g;
my $new = $_ for $old =~ s/foo/bar;
будет работать?s/foo/bar/ for my $newstring = $oldstring;
это работает, но это гораздо страннее.Заявление:
Что эквивалентно:
В качестве альтернативы, с Perl 5.13.2 вы можете использовать
/r
для неразрушающего замещения:источник
g
в своем регулярном выражении?Под
use strict
, скажем:вместо.
источник
Однострочное решение более полезно, чем шибболет, чем хороший код; Хорошие Perl-кодеры будут знать и понимать его, но он гораздо менее прозрачен и читаем, чем двухстрочный куплет-копируй-и-изменяй, с которого ты начинаешь.
Другими словами, хороший способ сделать это - это то, что вы уже делаете. Ненужное сжатие за счет читабельности не является победой.
источник
Другое решение до 5.14: http://www.perlmonks.org/?node_id=346719 (см. Пост japhy)
Поскольку его подход использует
map
, он также хорошо работает для массивов, но требует каскадногоmap
создания временного массива (в противном случае оригинал будет изменен):источник
Я ненавижу foo и bar .. кто придумал эти неописательные термины в программировании?
источник
=~ s
.)newword donotnewword newword donotnewword newword donotnewword
foo
иbar
его ответ был бы точным. Доказательство, еще раз, обычаи существуют по причине, и уроки изучены только трудным путем. ;)Если вы напишите на Perl
use strict;
, то вы обнаружите, что однострочный синтаксис недействителен, даже если объявлен.С участием:
Ты получаешь:
Вместо этого, синтаксис, который вы использовали, хотя и длиннее строки, является синтаксически правильным способом сделать это
use strict;
. Для меня использованиеuse strict;
- это просто привычка. Я делаю это автоматически. Каждый должен.источник
use warnings;
вместо этого-w
, вы получаете больший контроль: например, если вы хотите временно отключить предупреждения в блоке кода.