W Perlu jaki jest dobry sposób na wykonanie zamiany na łańcuch przy użyciu wyrażenia regularnego i zapisanie wartości w innej zmiennej bez zmiany oryginału?
Zwykle po prostu kopiuję ciąg do nowej zmiennej, a następnie wiążę go z s///
wyrażeniem regularnym, które zastępuje nowy ciąg, ale zastanawiałem się, czy istnieje lepszy sposób, aby to zrobić?
$newstring = $oldstring;
$newstring =~ s/foo/bar/g;
my $new = $_ for $old =~ s/foo/bar;
zadziała?s/foo/bar/ for my $newstring = $oldstring;
To działa, ale jest znacznie dziwniejsze.Twierdzenie:
Co odpowiada:
Alternatywnie, począwszy od Perla 5.13.2, możesz użyć,
/r
aby dokonać nieniszczącej zamiany:źródło
g
w swoim regexie?Poniżej
use strict
powiedz:zamiast.
źródło
Jednoliniowe rozwiązanie jest bardziej przydatne jako shibboleth niż dobry kod; dobrzy koderzy Perla znają go i rozumieją, ale jest on znacznie mniej przejrzysty i czytelny niż dwuliniowy dwuwierszowy kopiuj i modyfikuj kuplet, od którego zaczynasz.
Innymi słowy, dobrym sposobem na to jest sposób, w jaki już to robisz. Niepotrzebne zawarcie umowy kosztem czytelności nie jest wygraną.
źródło
Inne rozwiązanie sprzed 5.14: http://www.perlmonks.org/?node_id=346719 (patrz post japhy)
Zgodnie z jego podejściem
map
działa również dobrze dla tablic, ale wymaga kaskadowania wmap
celu utworzenia tablicy tymczasowej (w przeciwnym razie oryginał zostałby zmodyfikowany):źródło
Nienawidzę foo i bar .. kto marzył o tych nieopisowych terminach w programowaniu?
źródło
=~ s
.)newword donotnewword newword donotnewword newword donotnewword
foo
abar
jego odpowiedź byłaby trafna. Po raz kolejny udowadnianie, że istnieją zwyczaje, a lekcje wyciągane są tylko na trudny sposób. ;)Jeśli napiszesz Perla
use strict;
, przekonasz się, że składnia jednowierszowa jest nieprawidłowa, nawet jeśli została zadeklarowana.Z:
Dostajesz:
Zamiast tego używana przez ciebie składnia, choć dłuższa linia, jest poprawnym składniowo sposobem na zrobienie tego
use strict;
. Dla mnie używanieuse strict;
jest teraz tylko nawykiem. Robię to automatycznie. Każdy powinien.źródło
use warnings;
zamiast tego-w
zyskasz większą kontrolę: na przykład, jeśli chcesz tymczasowo wyłączyć ostrzeżenia w bloku kodu.