Di Perl, apa cara yang baik untuk melakukan penggantian pada string menggunakan ekspresi reguler dan menyimpan nilai dalam variabel yang berbeda, tanpa mengubah yang asli?
Saya biasanya hanya menyalin string ke variabel baru kemudian mengikatnya ke s///
regex yang melakukan penggantian pada string baru, tetapi saya bertanya-tanya apakah ada cara yang lebih baik untuk melakukan ini?
$newstring = $oldstring;
$newstring =~ s/foo/bar/g;
my $new = $_ for $old =~ s/foo/bar;
akan bekerja?s/foo/bar/ for my $newstring = $oldstring;
ini berhasil, tapi jauh lebih aneh.Pernyataan:
Yang setara dengan:
Atau, pada Perl 5.13.2 Anda dapat menggunakan
/r
untuk melakukan subtitusi yang tidak merusak:sumber
g
di regex teratas Anda?Di bawah
use strict
, katakan:sebagai gantinya.
sumber
Solusi one-liner lebih bermanfaat sebagai shibboleth daripada kode yang baik; coders Perl yang baik akan mengetahuinya dan memahaminya, tapi itu jauh lebih transparan dan mudah dibaca daripada dua baris salin dan modifikasi bait yang Anda mulai.
Dengan kata lain, cara yang baik untuk melakukan ini adalah cara Anda sudah melakukannya. Keputusan yang tidak perlu dengan biaya keterbacaan bukanlah kemenangan.
sumber
Solusi pra-5.14 lainnya: http://www.perlmonks.org/?node_id=346719 (lihat posting japhy)
Saat pendekatannya digunakan
map
, ini juga berfungsi dengan baik untuk array, tetapi membutuhkan kaskademap
untuk menghasilkan array sementara (jika tidak, yang asli akan dimodifikasi):sumber
Saya benci foo and bar .. siapa sih yang memimpikan istilah non deskriptif ini dalam pemrograman?
sumber
=~ s
.)newword donotnewword newword donotnewword newword donotnewword
foo
danbar
, jawabannya pasti akurat. Membuktikan, sekali lagi, adat ada karena suatu alasan dan pelajaran hanya dipelajari dengan cara yang sulit. ;)Jika Anda menulis Perl dengan
use strict;
, maka Anda akan menemukan bahwa sintaks satu baris tidak valid, bahkan ketika dideklarasikan.Dengan:
Anda mendapatkan:
Alih-alih, sintaksis yang telah Anda gunakan, sementara sebuah baris lebih panjang, adalah cara yang benar secara sintaksis untuk melakukannya
use strict;
. Bagi saya, menggunakanuse strict;
hanyalah kebiasaan sekarang. Saya melakukannya secara otomatis. Semua orang harus.sumber
use warnings;
bukannya-w
, Anda mendapatkan kontrol yang lebih besar: misalnya, jika Anda ingin mematikan sementara peringatan di blok kode.