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


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

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

Ve aynı değil eşittir operatör ile ...

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

Bu işe yarayacak gibi görünüyor (bence), ama doğru yolu olduğundan emin değilim, ya da öngörülemeyen dezavantajları varsa. Bir şey sadece bu konuda doğru hissetmiyor.


76
2018-01-11 23:16


Menşei




Cevaplar:


Perl'de dizi karşılaştırmaları için eq veya ne:

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

== ve != operatörler sayısal karşılaştırma operatörleri. Her iki işleneni de karşılaştırmadan önce tam sayıya dönüştürmeye çalışırlar.

Bakın perlop Daha fazla bilgi için man sayfa.


111
2018-01-11 23:20



Evet, bunu kullanarak, eğer undef ise ve uyarılar kullanıyorsanız bir çalışma zamanı uyarısı alacağınız konusunda ihtiyatlı olmanız gerekir. Yine de uyarı almak için birçok yol. - Evan Carroll


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

  2. Önceden korunmadığınız bir durumdaysanız undefDaha sonra, uyarılmayacak "boş olmayan" için yakalama if (defined $str and length $str).


84
2018-01-11 23:57



Uzunluğunun, ipte hiçbir şey olmadığı fikrinin ifadesine sahip olduğumuz en yakın test olduğunu düşünüyorum. - brian d foy
Giden if (length($str)) güzel bir yaklaşımdır ve değişken tanımlanmamışsa başarısız olmaz. - basic6


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

Eğer sen use warnings; senaryonuzda, bu konuda (ve diğer birçok yararlı şeyle ilgili) uyarı alırsınız; Tavsiye ederim use strict; de.


9
2018-01-11 23:27



+1 Cool, evet normalde kullanırım use strict ama bazı eski kodları güncelleştiriyorum, bu yüzden bunu eklediğimde yüzlerce hata alıyorum. Muhtemelen bir gün onları tamir edeceğim. - Nick Bolton


Muhtemelen "==" yerine "eq" yi kullanmak istersiniz. Bazı kenar durumları hakkında endişeleriniz varsa, tanımlanmamışları da kontrol etmek isteyebilirsiniz:

if (not defined $str) {

# this variable is undefined

}

9
2018-01-11 23:23



Dizeyi, 0 öğesine sahip olabilecek bir diziyi kaydırarak aldığınızda çok kullanışlıdır. - Dacav


CPAN kullanmanın dışında, bir şey yapmanın "uygun" bir yolu, Perl'de mevcut değildir.

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

if($foo eq "")

veya

if(length($foo) == 0)

2
2018-01-11 23:20



Perl'in problem çözmeye yönelik “tek doğru yolu” savunmaya yönelmediği doğrudur, ancak bu, tercih edilen deyimlerin ve tarzların ve yaklaşımların olmadığı anlamına gelmez. Ayrıca, Perl düzenleyicilerinden biri, bir şeyleri yapmak için birden fazla yol olsa bile, çok şey söylemekten hoşlanır. bazı Bir şeyleri yapmanın yolları gerçekten, gerçekten çok kötü (aptal, kötü tavsiyede bulunmak, bakımı zor, vb.) - Telemachus
Bunu yapmanın birçok yolu olduğu için, tüm yolların eşit olduğu anlamına gelmez. Boş dizeleri kullanarak test etme if ($foo == "")örneğin, kesinlikle yanlış gerçekten test edip etmediğiniz sürece $foosayısal bağlamda değerlendirildiğinde, 0 değeri vardır. yinedaha iyi yazılmak if ($foo == 0), daha açık bir şekilde niyetinizi ifade eder). - Dave Sherohman


Boş bir dizeyi kontrol etmek için aşağıdaki gibi bir şey yapabilirsiniz

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

0
2017-11-06 04:19