Bagaimana cara membandingkan dua string dalam Perl?
Saya belajar Perl, saya punya pertanyaan mendasar mencarinya di sini di StackOverflow dan tidak menemukan jawaban yang baik jadi saya pikir saya akan bertanya.
Bagaimana cara membandingkan dua string dalam Perl?
Saya belajar Perl, saya punya pertanyaan mendasar mencarinya di sini di StackOverflow dan tidak menemukan jawaban yang baik jadi saya pikir saya akan bertanya.
Jawaban:
Lihat perlop perldoc . Gunakan lt, gt, eq, ne, dan cmpsesuai untuk perbandingan string:
Biner
eqmengembalikan nilai true jika argumen kiri sama dengan argumen kanan.Biner
nemengembalikan true jika argumen kiri adalah stringwise tidak sama dengan argumen yang benar.Biner
cmpmengembalikan -1, 0, atau 1 tergantung pada apakah argumen kiri kurang dari, sama dengan, atau lebih besar dari argumen kanan.Binary
~~melakukan smartmatch antara argumennya. ...
lt,le,ge,gtDancmpmenggunakan pemeriksaan (semacam) agar ditentukan oleh lokal saat ini jika penggunaan warisan lokal (tapi tidakuse locale ':not_characters') yang berlaku. Lihat perllocale . Jangan mencampur ini dengan Unicode, hanya dengan pengkodean biner lama. Modul standar Unicode :: Collate dan Unicode :: Collate :: Locale menawarkan solusi yang jauh lebih kuat untuk masalah collation.
indexuntuk melihat apakah string adalah substring dari yang lain.
!=dan netidak sama, karena !=dan nedidefinisikan berbeda. Seberapa keras itu ?! Menjadi operator perbandingan numerik, !=mengubah kedua operan menjadi angka perl -E 'say "equal" if not "a" != "b"'.
cmp Membandingkan
'a' cmp 'b' # -1
'b' cmp 'a' # 1
'a' cmp 'a' # 0eq Sama dengan
'a' eq 'b' # 0
'b' eq 'a' # 0
'a' eq 'a' # 1ne Tidak sebanding dengan
'a' ne 'b' # 1
'b' ne 'a' # 1
'a' ne 'a' # 0lt Kurang dari
'a' lt 'b' # 1
'b' lt 'a' # 0
'a' lt 'a' # 0le Kurang dari atau sama dengan
'a' le 'b' # 1
'b' le 'a' # 0
'a' le 'a' # 1gt Lebih besar dari
'a' gt 'b' # 0
'b' gt 'a' # 1
'a' gt 'a' # 0ge Lebih dari atau sama dengan
'a' ge 'b' # 0
'b' ge 'a' # 1
'a' ge 'a' # 1Lihat perldoc perlopuntuk informasi lebih lanjut.
(Saya menyederhanakan ini sedikit tetapi cmpmengembalikan nilai yang merupakan string kosong, dan bukan nilai numerik nol 0, dan nilai yang merupakan string '1'dan nilai numerik 1. Ini adalah nilai yang sama dengan yang Anda inginkan selalu dapatkan dari operator boolean di Perl. Anda seharusnya hanya menggunakan nilai pengembalian untuk operasi boolean atau numerik, dalam hal ini perbedaannya tidak terlalu penting.)
eq, gt, ltdll tidak benar ... Mereka kembali benar atau salah. Hanya cmpmengembalikan nilai numerik tertentu.
legbukannya cmpyang digunakan untuk perbandingan generik.
Selain Sinan Ünür daftar komprehensif operator perbandingan string, Perl 5.10 menambahkan operator pertandingan pintar.
Operator kecocokan pintar membandingkan dua item berdasarkan jenisnya. Lihat grafik di bawah ini untuk perilaku 5.10 (saya percaya perilaku ini sedikit berubah di 5.10.1):
perldoc perlsyn"Pencocokan pintar secara detail" :Perilaku kecocokan cerdas bergantung pada jenis argumennya. Itu selalu komutatif, yaitu
$a ~~ $bberperilaku sama dengan$b ~~ $a. Perilaku ditentukan oleh tabel berikut: baris pertama yang berlaku, dalam urutan apa pun, menentukan perilaku kecocokan.
$ a $ b Jenis Pencocokan Kode Pencocokan Tersirat ====== ===== ===================== ============= (Overloading mengalahkan segalanya) Kode [+] Kode [+] persamaan referensial $ a == $ b Kode Apa pun [+] skalar sub kebenaran $ b -> ($ a) Hash Hash kunci hash identik [kunci sortir% $ a] ~~ [kunci sortir% $ b] Keberadaan hash slice Hash Array grep {ada $ a -> {$ _}} @ $ b Hash Regex kunci hash grep grep / $ b /, kunci% $ a Hash Adanya entri hash ada $ a -> {$ b} Array Array array adalah identik [*] Array Regex array grep grep / $ b /, @ $ a Array Num array berisi angka grep $ _ == $ b, @ $ a Array Setiap array berisi string grep $ _ eq $ b, @ $ a Undefined undefined! Didefinisikan $ a Kecocokan pola Regex apa pun $ a = ~ / $ b / Code () Hasil Code () sama dengan $ a -> () eq $ b -> () Kode apa pun () kebenaran penutupan sederhana $ b -> () # abaikan $ a Num numish [!] Persamaan numerik $ a == $ b Kesetaraan string Str apa saja $ a eq $ b Kesetaraan angka numerik apa pun $ a == $ b Any Any any string equality $ a eq $ b + - ini harus berupa referensi kode yang prototipenya (jika ada) bukan "" (subs dengan "" prototipe ditangani oleh entri 'Kode ()' lebih rendah ke bawah) * - yaitu, setiap elemen cocok dengan elemen indeks yang sama di lainnya Himpunan. Jika referensi melingkar ditemukan, kami kembali ke referensi persamaan. ! - baik bilangan real, atau string yang terlihat seperti angka"Kode pencocokan" tidak mewakili kode pencocokan nyata, tentu saja: hanya ada di sana untuk menjelaskan arti yang dimaksud. Tidak seperti grep, operator korek api pintar akan melakukan hubungan pendek kapan pun bisa.
Pencocokan khusus melalui overloading Anda dapat mengubah cara suatu objek dicocokkan dengan overloading
~~operator. Ini mengalahkan semantik pertandingan cerdas yang biasa. Lihatoverload.
print "Matched!\n" if ($str1 eq $str2)
Perl memiliki perbandingan string terpisah dan operator perbandingan numerik untuk membantu pengetikan longgar dalam bahasa. Anda harus membaca perlop untuk semua operator yang berbeda.
Subteks yang jelas dari pertanyaan ini adalah:
mengapa Anda tidak bisa hanya menggunakan
==untuk memeriksa apakah dua string sama?
Perl tidak memiliki tipe data yang berbeda untuk teks vs angka. Keduanya diwakili oleh tipe "skalar" . Dengan kata lain, string adalah angka jika Anda menggunakannya .
if ( 4 == "4" ) { print "true"; } else { print "false"; }
true
if ( "4" == "4.0" ) { print "true"; } else { print "false"; }
true
print "3"+4
7
Karena teks dan angka tidak dibedakan berdasarkan bahasa, kami tidak bisa begitu saja membebani ==operator untuk melakukan hal yang benar untuk kedua kasus. Oleh karena itu, Perl menyediakan equntuk membandingkan nilai sebagai teks:
if ( "4" eq "4.0" ) { print "true"; } else { print "false"; }
false
if ( "4.0" eq "4.0" ) { print "true"; } else { print "false"; }
true
Pendeknya:
==atau !=, untuk membandingkan dua operan sebagai angkaeqatau ne, untuk membandingkan dua operan sebagai teksAda banyak fungsi dan operator lain yang dapat digunakan untuk membandingkan nilai skalar, tetapi mengetahui perbedaan antara kedua bentuk ini merupakan langkah pertama yang penting.
Dan jika Anda ingin mengekstraksi perbedaan antara kedua string, Anda dapat menggunakan String :: Diff .