Apa cara yang tepat untuk memeriksa apakah sebuah string kosong di Perl?

95

Saya baru saja menggunakan kode ini untuk memeriksa apakah sebuah string kosong:

if ($str == "")
{
  // ...
}

Dan juga sama dengan operator tidak sama ...

if ($str != "")
{
  // ...
}

Ini sepertinya berhasil (menurut saya), tetapi saya tidak yakin itu cara yang benar, atau jika ada kelemahan yang tak terduga. Sesuatu terasa tidak benar tentang itu.

Nick Bolton
sumber

Jawaban:

134

Untuk perbandingan string di Perl, gunakan eqatau ne:

if ($str eq "")
{
  // ...
}

The ==dan !=operator numerik operator perbandingan. Mereka akan mencoba mengonversi kedua operan menjadi bilangan bulat sebelum membandingkannya.

Lihat halaman manual perlop untuk informasi lebih lanjut.

Greg Hewgill
sumber
Ya, menggunakan ini meskipun Anda perlu berhati-hati jika undef, dan jika Anda menggunakan peringatan, Anda akan mendapatkan peringatan runtime. Banyak cara untuk menyiasati peringatan itu.
Evan Carroll
90
  1. Karena cara string disimpan di Perl, mendapatkan panjang string dioptimalkan.
    if (length $str)adalah cara yang baik untuk memeriksa bahwa string tidak kosong.

  2. Jika Anda berada dalam situasi di mana Anda belum berhati-hati undef, maka jawaban untuk "tidak kosong" yang tidak akan memperingatkan adalah if (defined $str and length $str).

hobbs
sumber
6
Saya pikir panjang itu adalah tes terdekat yang kita miliki dengan ungkapan gagasan bahwa tidak ada apa pun dalam string.
Brian d foy
6
Suara positif karena if (length($str))merupakan pendekatan yang bagus dan tidak gagal jika variabel tidak ditentukan.
basic6
10

Anda mungkin ingin menggunakan "eq" daripada "==". Jika Anda khawatir tentang beberapa kasus tepi, Anda mungkin juga ingin memeriksa tidak terdefinisi:

if (not defined $str) {

# this variable is undefined

}
DmitryK
sumber
1
Sangat berguna ketika Anda mendapatkan string dengan menggeser array yang mungkin memiliki 0 elemen.
Dacav
9

Seperti yang sudah disebutkan oleh beberapa orang, eqapakah operator yang tepat disini.

Jika Anda berada use warnings;dalam skrip Anda, Anda akan mendapatkan peringatan tentang ini (dan banyak hal berguna lainnya); Saya akan merekomendasikan use strict;juga.

Matthew Slattery
sumber
+1 Keren, ya saya biasanya menggunakan use stricttetapi saya memperbarui beberapa kode lama, jadi ketika saya menambahkan ini saya mendapatkan ratusan kesalahan. Saya mungkin akan memperbaikinya suatu hari nanti.
Nick Bolton
4

Konsep dari cara yang "tepat" untuk melakukan apapun, selain menggunakan CPAN, tidak ada di Perl.

Bagaimanapun itu adalah operator numerik, Anda harus menggunakan

if($foo eq "")

atau

if(length($foo) == 0)
Apa namanya
sumber
3
Memang benar bahwa Perl tidak cenderung menganjurkan "satu cara yang benar" untuk memecahkan masalah, tetapi itu tidak berarti bahwa tidak ada idiom, gaya, dan pendekatan yang sangat disukai. Juga, karena salah satu pelanggan tetap Perl suka mengatakan banyak hal, meskipun ada lebih dari satu cara untuk melakukan sesuatu, beberapa cara untuk melakukan sesuatu benar-benar buruk (bodoh, keliru, sulit dipelihara, dll. .)
Telemakus
2
Hanya karena ada banyak cara untuk melakukannya tidak berarti bahwa semua cara itu sama. Pengujian untuk string kosong menggunakan if ($foo == ""), misalnya, adalah definitif salah kecuali Anda benar-benar berarti untuk menguji untuk apakah $foo, dievaluasi dalam konteks numerik, memiliki nilai 0 (dalam hal ini akan masih lebih baik ditulis sebagai if ($foo == 0), karena itu lebih jelas mengungkapkan Anda maksud).
Dave Sherohman
0

Untuk memeriksa string kosong, Anda juga bisa melakukan sesuatu sebagai berikut

if (!defined $val || $val eq '')
{
    # empty
}
Roland Ayala
sumber