Perl'de bir dizgenin boş olup olmadığını kontrol etmenin doğru yolu nedir?


98

Bir dizenin boş olup olmadığını kontrol etmek için bu kodu kullanıyorum:

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

Ayrıca not equals operatörü ile aynı ...

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

Bu işe yarıyor gibi görünüyor (sanırım), ancak bunun doğru yol olduğundan veya öngörülemeyen sakıncaların olup olmadığından emin değilim. Bu konuda doğru olmayan bir şey var.

Yanıtlar:


136

Perl'de dizi karşılaştırmaları için eqveya kullanın ne:

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

==Ve !=operatörleri sayısal karşılaştırma operatörleri. Karşılaştırmadan önce her iki işleneni de tamsayılara dönüştürmeye çalışacaklar.

Daha fazla bilgi için perlop man sayfasına bakın .


Evet, bunu kullanırken, eğer undef ise ve uyarıları kullanıyorsanız, bir çalışma zamanı uyarısı alacağınız konusunda dikkatli olmanız gerekir. Yine de uyarıyı aşmanın birçok yolu.
Evan Carroll

94
  1. Dizelerin Perl'de depolanma şekli nedeniyle, bir dizenin uzunluğunun elde edilmesi optimize edilmiştir.
    if (length $str)bir dizenin boş olmadığını kontrol etmenin iyi bir yoludur.

  2. Henüz korunmadığınız bir durumdaysanız undef, o zaman "boş olmayan" için uyarmayan her şeyi yakalayın if (defined $str and length $str).


7
Sanırım bu uzunluk, dizede hiçbir şey olmadığı fikrinin ifadesine en yakın testtir.
brian d foy

6
Olumlu oy verildi çünkü if (length($str))güzel bir yaklaşım ve değişken tanımlanmazsa başarısız olmaz.
basic6

10

Muhtemelen "==" yerine "eq" kullanmak istiyorsunuz. Bazı uç durumlardan endişe ediyorsanız, tanımlanmamış olanları da kontrol etmek isteyebilirsiniz:

if (not defined $str) {

# this variable is undefined

}

1
0 elemanı olabilecek bir diziyi kaydırarak dizeyi elde ettiğinizde çok kullanışlıdır.
Dacav

9

Daha önce birkaç kişi tarafından belirtildiği gibi, eqburada doğru operatör.

Eğer varsa use warnings;komut dosyanızda, bu konuda uyarılar (ve diğer birçok faydalı şeyler) elde edersiniz; Ben use strict;de tavsiye ederim .


+1 Harika, evet normalde kullanıyorum use strictama bazı eski kodları güncelliyorum, bu yüzden bunu eklediğimde yüzlerce hata alıyorum. Muhtemelen bir gün tamir edeceğim.
Nick Bolton

4

CPAN kullanmak dışında herhangi bir şeyi yapmanın "uygun" bir yolu kavramı Perl'de yoktur.

Her neyse, bunlar sayısal operatörler, kullanmalısınız

if($foo eq "")

veya

if(length($foo) == 0)

3
Perl'in problem çözmeye yönelik "tek gerçek yolu" savunmaya meyilli olmadığı doğrudur, ancak bu, şiddetle tercih edilen deyimler, tarzlar ve yaklaşımlar olmadığı anlamına gelmez. Ayrıca, Perl müdavimlerinden biri çok şey söylemeyi sevdiği için, bir şeyler yapmanın birden fazla yolu olsa bile, bazı şeyleri yapmanın bazı yolları gerçekten çok kötüdür (aptalca, tavsiye edilmeyen, bakımı zor, vb.) .)
Telemachus

2
Bunu yapmanın birçok yolu olduğu için, tüm yolların eşit olduğu anlamına gelmez. if ($foo == "")Örneğin, sayısal bağlamda değerlendirildiğinde, 0 değerine sahip olup olmadığını test etmek istemediğiniz sürece boş dizeleri test etmek kesinlikle yanlıştır$foo (bu durumda yine de daha iyi yazılır if ($foo == 0), çünkü bu sizin niyet).
Dave Sherohman

0

Boş bir dizge olup olmadığını kontrol etmek için aşağıdaki gibi bir şey de yapabilirsiniz.

if (!defined $val || $val eq '')
{
    # empty
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.