Denedim:
$var = false;
$var = FALSE;
$var = False;
Bunların hiçbiri işe yaramıyor. Hata mesajını alıyorum
Bareword "false", "katı subs" kullanımdayken izin verilmez.
Denedim:
$var = false;
$var = FALSE;
$var = False;
Bunların hiçbiri işe yaramıyor. Hata mesajını alıyorum
Bareword "false", "katı subs" kullanımdayken izin verilmez.
Yanıtlar:
Perl'de, aşağıdaki şartlar altında yanlış olarak değerlendirilir:
0
'0'
undef
'' # Empty scalar
() # Empty list
('')
Gerisi doğrudur. Hiçbir barewords vardır true
ya false
.
undef
.
('')
ve ''
aynı değerlerdir. Sanırım boş bir dizeden oluşan bir öğe içeren bir liste ima etmek istediniz (parensler liste oluşturmasa bile), ancak daha önce de belirttiğim gibi, bir listenin yanlış olup olmadığını kontrol etmek imkansız.
!0
aka PL_sv_yes
) ve yanlış ( !1
aka PL_sv_no
) vardır. Yoksa Perl'in bu iki değerden başka bir şey doğruluk açısından test edildiğinde sarılması gerektiğini mi söylüyorsunuz? Bu tamamen korkunç olurdu. Örneğin önleyecektir$x ||= $default;
Karşılaştığım yanlışlığın en eksiksiz ve özlü tanımı:
Boş dizeye veya dizeye dizgi oluşturan
0
her şey yanlıştır. Diğer her şey doğrudur.
Bu nedenle, aşağıdaki değerler yanlıştır:
Boş bir liste değişmezinin skaler bağlamda tanımlanmamış bir değeri değerlendirdiğini, dolayısıyla yanlış bir şeyi değerlendirdiğini unutmayın.
"Gerçek sıfırlar" üzerine bir not
0
Dize olarak nitelenen sayılar yanlış olsa da, sıfıra kadar olan dizeler zorunlu değildir. Yalnızca yanlış dizeler 0
ve boş dize vardır. Başka herhangi bir dize, sıfıra doğru olsa bile doğrudur.
Aşağıda, bir boole olarak doğru ve sayı olarak sıfır olan dizeler verilmiştir:
"0.0"
"0E0"
"00"
"+0"
"-0"
" 0"
"0\n"
".0"
"0."
"0 but true"
"\t00"
"\n0e1"
"+0.e-9"
Scalar::Util::looks_like_number
False değerini döndüren herhangi bir dize . (ör. "abc"
)my $value = do { package XXX; use overload q[""] => sub { "XXX" }, q[bool] => sub { 0 }; bless [] };
. Şimdi $value
"XXX" şeklinde dizgi yapacak, ancak false değerine yükseltilecek.
bool
dizgi haline geldiğini unutmayın 0
. Ayrıca, tutarsız aşırı yükler oluşturmaktan vazgeçersiniz ve geri döndüğünüz değerler böyle düşünülebilir. (örneğin a &&
, a olarak optimize edilebilir ||
, bu nedenle bunlar tutarsız olsaydı, bir sorununuz olurdu.)
0x00
Burada ele alınıp alınmadığından emin değilim .
0x00
(sıfır sayısal değeri) veya dize 0x00
(bunun looks_like_number
için yanlış olan) tarafından döndürülen değeri mi kastediyorsunuz ? Her iki durumda da, zaten kaplıdır.
Perl yerel bir boolean tipine sahip değildir, ancak aynı davranışı elde etmek için tamsayıların veya dizelerin karşılaştırmasını kullanabilirsiniz. Alan'ın örneği, tamsayıların karşılaştırmasını kullanarak bunu yapmanın güzel bir yoludur. İşte bir örnek
my $boolean = 0;
if ( $boolean ) {
print "$boolean evaluates to true\n";
} else {
print "$boolean evaluates to false\n";
}
Bazı programlarımda yaptığım bir şey, bir sabit kullanarak aynı davranışı eklenir:
#!/usr/bin/perl
use strict;
use warnings;
use constant false => 0;
use constant true => 1;
my $val1 = true;
my $val2 = false;
print $val1, " && ", $val2;
if ( $val1 && $val2 ) {
print " evaluates to true.\n";
} else {
print " evaluates to false.\n";
}
print $val1, " || ", $val2;
if ( $val1 || $val2 ) {
print " evaluates to true.\n";
} else {
print " evaluates to false.\n";
}
"Use constant" ile işaretlenen satırlar, her zaman 1 olarak değerlendirilen true adında bir sabit ve her zaman 0 ile değerlendirilen false adında bir sabit tanımlar. Perl'de sabitlerin tanımlanma biçimi nedeniyle, aşağıdaki kod satırları da başarısız olur:
true = 0;
true = false;
Hata iletisi, "Skaler atamada sabit değiştirilemiyor" gibi bir şey söylemelidir.
Bunu dizelerden karşılaştırmayı sorduğunuz yorumlardan birinde gördüm. Bilmelisiniz ki Perl, dizeleri ve sayısal türleri skaler değişkenlerde birleştirdiğinden, dizeleri ve sayıları karşılaştırmak için farklı sözdizimine sahipsiniz:
my $var1 = "5.0";
my $var2 = "5";
print "using operator eq\n";
if ( $var1 eq $var2 ) {
print "$var1 and $var2 are equal!\n";
} else {
print "$var1 and $var2 are not equal!\n";
}
print "using operator ==\n";
if ( $var1 == $var2 ) {
print "$var1 and $var2 are equal!\n";
} else {
print "$var1 and $var2 are not equal!\n";
}
Bu operatörler arasındaki fark Perl'de çok yaygın bir karışıklık kaynağıdır.
use warnings;
yerine#! perl -w
if ($exitstatus) { exit; }
vs if ($exitstatus == true) { exit; }
, sıradan bir gözlemci için açık olmayabilir. (Ve evet, son örnek zayıf programlama stilidir, ancak bu konunun yanındadır).
Ben tavsiye ederim use boolean;
. Boolean modülünü cpan'dan kurmanız gerekiyor .
if ($my_true_value == true)
. Benim deneyime göre, acıya giden yol ve verimsiz kod, Bir Gerçek Hakikat olduğunu iddia etmek.
Favorilerim her zaman oldu
use constant FALSE => 1==0;
use constant TRUE => not FALSE;
iç temsilden tamamen bağımsız olan
Perl'de hangi değerlerin doğru ve yanlış olduğu hakkında iyi bir açıklamaya sahip bir öğretici ile karşılaştım . Şunu belirtir:
Aşağıdaki skaler değerler yanlış kabul edilir:
undef
- tanımlanmamış değer0
000 veya 0.0 olarak yazsanız bile 0 sayısı''
boş dize.'0'
tek bir 0 rakamı içeren dize.Aşağıdakiler dahil olmak üzere diğer tüm skaler değerler doğrudur:
1
0 olmayan herhangi bir sayı' '
içinde boşluk olan dize'00'
bir dizede iki veya daha fazla 0 karakter"0\n"
a 0 ve ardından yeni satır'true'
'false'
evet, 'false' dizesi bile doğru olarak değerlendirilir.Perl hakkında doğru ve yanlış açıklayan iyi bir öğretici daha var .
Bobf tarafından Boole değerleri için verilen güzel açıklama : Doğru mu Yanlış mı? Hızlı Başvuru Kılavuzu
Farklı değerler için doğruluk testleri
Result of the expression when $var is:
Expression | 1 | '0.0' | a string | 0 | empty str | undef
--------------------+--------+--------+----------+-------+-----------+-------
if( $var ) | true | true | true | false | false | false
if( defined $var ) | true | true | true | true | true | false
if( $var eq '' ) | false | false | false | false | true | true
if( $var == 0 ) | false | true | true | true | true | true
Aşağıdaki dosya önekini kullanın, bu perl betiğinize eTRUE ve eFALSE ekleyecektir, aslında GERÇEK (!) doğru ve yanlış olacaktır (tıpkı java gibi)
#!/usr/bin/perl
use strict;
use warnings;
use constant { #real true false, compatible with encode_json decode_json for later (we don't want field:false... will be field:0...)
eTRUE => bless( do{\(my $o = 1)}, 'JSON::PP::Boolean' ),
eFALSE => bless( do{\(my $o = 0)}, 'JSON::PP::Boolean' )
};
Aslında bunu kullanmanız için birkaç neden var.
Benim nedenim JSON ile çalışmak, anahtarlara değer olarak 0 ve 1 var, ama bu kesmek komutunuz boyunca doğru değerlerin korunmasını sağlayacaktır.