Сведения о вопросе

rjevskii

04:29, 4th August, 2020

Теги

regex   perl   replace    

Как выполнить подстановку Perl в строке, сохраняя при этом оригинал?

Просмотров: 405   Ответов: 7

В Perl, какой хороший способ выполнить замену строки с помощью регулярного выражения и сохранить значение в другой переменной, не изменяя оригинал?

Обычно я просто копирую строку в новую переменную, а затем привязываю ее к s/// regex, который делает замену на новую строку, но мне было интересно, есть ли лучший способ сделать это?

$newstring = $oldstring;
$newstring =~ s/foo/bar/g;



  Сведения об ответе

$DOLLAR

08:44, 20th August, 2020

Это идиома, которую я всегда использовал, чтобы получить модифицированную копию строки без изменения оригинала:

(my $newstring = $oldstring) =~ s/foo/bar/g;

В perl 5.14.0 или более поздней версии можно использовать новый модификатор неразрушающей замены /r :

my $newstring = $oldstring =~ s/foo/bar/gr; 

Примечание: вышеуказанные решения работают и без g . Они также работают с любыми другими модификаторами.


  Сведения об ответе

VCe znayu

13:43, 27th August, 2020

Заявление:

(my $newstring = $oldstring) =~ s/foo/bar/g;

Что эквивалентно:

my $newstring = $oldstring;
$newstring =~ s/foo/bar/g;

Кроме того, начиная с Perl 5.13.2 вы можете использовать /r для выполнения неразрушающей замены:

use 5.013;
#...
my $newstring = $oldstring =~ s/foo/bar/gr;


  Сведения об ответе

park

05:03, 21st August, 2020

Под use strict, скажем:

(my $new = $original) =~ s/foo/bar/;

вместо.


  Сведения об ответе

VCe znayu

13:17, 19th August, 2020

Однострочное решение более полезно в качестве шиболета, чем хороший код; хорошие кодеры Perl будут знать его и понимать, но оно гораздо менее прозрачно и читаемо, чем двухстрочный куплет copy-and-modify, с которого вы начинаете.

Другими словами, хороший способ сделать это-это то, как вы уже делаете это. Ненужная лаконичность ценой читабельности-это не победа.


  Сведения об ответе

SSESION

18:14, 5th August, 2020

Я ненавижу фу и бар .. кто вообще придумал эти не описательные термины в программировании?

my $oldstring = "replace donotreplace replace donotreplace replace donotreplace";

my $newstring = $oldstring;
$newstring =~ s/replace/newword/g; # inplace replacement

print $newstring;
%: newword donotreplace newword donotreplace newword donotreplace


  Сведения об ответе

PAGE

21:27, 2nd August, 2020

Другую предварительно 5.14 решение: http://www.perlmonks.org/?node_id=346719 (см. сообщение джафи)

Поскольку его подход использует map , он также хорошо работает для массивов, но требует каскадирования map для создания временного массива (в противном случае оригинал был бы изменен):

my @orig = ('this', 'this sucks', 'what is this?');
my @list = map { s/this/that/; $_ } map { $_ } @orig;
# @orig unmodified


  Сведения об ответе

darknet

03:47, 18th August, 2020

Если вы пишете Perl с use strict;, то обнаружите, что синтаксис одной строки недопустим, даже если он объявлен.

С:

my ($newstring = $oldstring) =~ s/foo/bar/;

Вы получаете:

Can't declare scalar assignment in "my" at script.pl line 7, near ") =~"
Execution of script.pl aborted due to compilation errors.

Вместо этого синтаксис, который вы использовали, хотя и на одну строку длиннее, является синтаксически правильным способом сделать это с use strict; . Для меня использование use strict; теперь просто привычка. Я делаю это автоматически. Все должны знать.

#!/usr/bin/env perl -wT

use strict;

my $oldstring = "foo one foo two foo three";
my $newstring = $oldstring;
$newstring =~ s/foo/bar/g;

print "$oldstring","\n";
print "$newstring","\n";


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться