Perl: используйте s/(replace) и верните новую строку
В Perl оператор s/
используется для замены частей строки. Теперь s/
изменит свой параметр (строку) на месте. Я хотел бы, однако, заменить части строки перед печатью, как в
print "bla: ", replace("a","b",$myvar),"\n";
Есть ли такая функция replace
в Perl или какой-либо другой способ сделать это? s/
не будет работать напрямую в этом случае, и я бы хотел избежать использования вспомогательной переменной. Есть ли способ сделать это в режиме онлайн?
Ответы
Ответ 1
Непроверенные:
require 5.013002;
print "bla: ", $myvar =~ s/a/b/r, "\n";
См. perl5132delta:
Теперь оператор подстановки поддерживает параметр /r, который копирует входную переменную, выполняет подстановку на копии и возвращает результат. Оригинал остается немодифицированным.
my $old = 'cat';
my $new = $old =~ s/cat/dog/r;
# $old is 'cat' and $new is 'dog'
Ответ 2
Если у вас Perl 5.14 или выше, вы можете использовать опцию /r
с оператором подстановки для выполнения неразрушающего замещения:
print "bla: ", $myvar =~ s/a/b/r, "\n";
В более ранних версиях вы можете добиться того же, используя блок do()
с временной лексической переменной, например:
print "bla: ", do { (my $tmp = $myvar) =~ s/a/b/; $tmp }, "\n";
Ответ 3
print "bla: ", $myvar =~ tr{a}{b},"\n";
Ответ 4
print "bla: ", $_, "\n" if ($_ = $myvar) =~ s/a/b/g or 1;
Ответ 5
Если вы действительно этого хотите, вы можете сделать свой собственный, но я бы этого не сделал, потому что у вас гораздо больше функциональности с s///
... вы могли бы создать эту функциональность в своей функции, но зачем воссоздать то, что уже существует?
#!/usr/bin/perl -w
use strict;
main();
sub main{
my $foo = "blahblahblah";
print '$foo: ' , replace("lah","ar",$foo) , "\n"; #$foo: barbarbar
}
sub replace {
my ($from,$to,$string) = @_;
$string =~s/$from/$to/ig; #case-insensitive/global (all occurrences)
return $string;
}