Próbowałem:
$var = false;
$var = FALSE;
$var = False;
Żadna z tych czynności nie działa. Pojawia się komunikat o błędzie
Bareword „false” jest niedozwolony podczas używania „ścisłych napisów”.
Próbowałem:
$var = false;
$var = FALSE;
$var = False;
Żadna z tych czynności nie działa. Pojawia się komunikat o błędzie
Bareword „false” jest niedozwolony podczas używania „ścisłych napisów”.
Odpowiedzi:
W Perlu następujące wartości warunkowe są fałszywe:
0
'0'
undef
'' # Empty scalar
() # Empty list
('')
Reszta jest prawdą. Brak słów kluczowych dla true
lub false
.
undef
.
('')
i ''
mają tę samą wartość. Myślę, że chciałeś sugerować listę z elementem składającym się z pustego łańcucha (nawet jeśli pareny nie tworzą list), ale jak już wspomniałem, nie można sprawdzić, czy lista jest prawdziwa z fałszem.
!0
aka PL_sv_yes
) i fałsz ( !1
aka PL_sv_no
). A może mówisz, że Perl powinien skakać, ilekroć coś innego niż te dwie wartości jest sprawdzane pod kątem prawdziwości? To byłoby całkowicie okropne. np. To zapobiegłoby$x ||= $default;
Najbardziej kompletna, zwięzła definicja fałszu, na jaką natrafiłem, to:
Wszystko, co zawiera pusty ciąg lub ciąg,
0
jest fałszywe. Wszystko inne jest prawdą.
Dlatego następujące wartości są fałszywe:
Należy pamiętać, że pusty literał listy ocenia na wartość nieokreśloną w kontekście skalarnym, więc zwraca wartość fałszywą.
Uwaga na temat „prawdziwych zer”
Podczas gdy liczby, które są oznaczane jako 0
fałsz, są fałszywe, ciągi, które numerują do zera, niekoniecznie. Jedyne fałszywe ciągi to 0
pusty ciąg. Każdy inny ciąg znaków, nawet jeśli ma wartość zero, jest prawdziwy.
Poniżej przedstawiono ciągi znaków, które są prawdziwe jako wartość logiczna, a zero jako liczba:
"0.0"
"0E0"
"00"
"+0"
"-0"
" 0"
"0\n"
".0"
"0."
"0 but true"
"\t00"
"\n0e1"
"+0.e-9"
Scalar::Util::looks_like_number
zwraca wartość false. (np. "abc"
)my $value = do { package XXX; use overload q[""] => sub { "XXX" }, q[bool] => sub { 0 }; bless [] };
. Teraz $value
skretyfikuje do „XXX”, ale loguje się w false.
bool
stringify to 0
. Ponadto odradza się tworzenie niespójnych przeciążeń, a zwracane wartości można uznać za takie. (np. &&
można zoptymalizować w a ||
, więc gdyby były niespójne, miałbyś problem).
0x00
jest tutaj objęty.
0x00
(wartość liczbowa zero) lub ciąg znaków 0x00
(dla których looks_like_number
jest fałsz)? Tak czy inaczej, jest już objęty.
Perl nie ma rodzimego typu logicznego, ale można użyć porównania liczb całkowitych lub ciągów, aby uzyskać takie samo zachowanie. Przykład Alana jest dobrym sposobem na to, używając porównania liczb całkowitych. Oto przykład
my $boolean = 0;
if ( $boolean ) {
print "$boolean evaluates to true\n";
} else {
print "$boolean evaluates to false\n";
}
Jedną rzeczą, którą zrobiłem w niektórych moich programach, jest dodanie tego samego zachowania przy użyciu stałej:
#!/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";
}
Linie oznaczone jako „użyj stałej” definiują stałą o nazwie prawda, która zawsze ma wartość 1, oraz stałą o nazwie fałsz, która zawsze ma wartość 0. Ze względu na sposób, w jaki stałe są definiowane w Perlu, następujące wiersze kodu również zawodzą:
true = 0;
true = false;
Komunikat o błędzie powinien brzmieć „Nie można zmodyfikować stałej w przypisaniu skalarnym”.
Widziałem to w jednym z komentarzy, które pytałeś o porównywanie ciągów. Powinieneś wiedzieć, że ponieważ Perl łączy ciągi i typy liczbowe w zmiennych skalarnych, masz inną składnię do porównywania ciągów i liczb:
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";
}
Różnica między tymi operatorami jest bardzo powszechnym źródłem nieporozumień w Perlu.
use warnings;
zamiast#! perl -w
if ($exitstatus) { exit; }
vs if ($exitstatus == true) { exit; }
, co może nie być oczywiste dla zwykłego obserwatora. (I tak, ostatnim przykładem jest kiepski styl programowania, ale to nie ma znaczenia).
Polecam use boolean;
. Musisz jednak zainstalować moduł boolean z cpan.
if ($my_true_value == true)
. Udawanie, że istnieje Jedna Prawdziwa Prawda, jest, z mojego doświadczenia, ścieżką do bólu i nieefektywnym kodem.
Moimi ulubionymi zawsze byli
use constant FALSE => 1==0;
use constant TRUE => not FALSE;
który jest całkowicie niezależny od wewnętrznej reprezentacji.
Natknąłem się na samouczek, który dobrze wyjaśnia, jakie wartości są prawdziwe i fałszywe w Perlu . Stwierdza, że:
Następujące wartości skalarne są uważane za fałszywe:
undef
- niezdefiniowana wartość0
liczba 0, nawet jeśli napiszesz jako 000 lub 0,0''
pusty ciąg.'0'
ciąg zawierający jedną cyfrę 0.Wszystkie inne wartości skalarne, w tym następujące, są prawdziwe:
1
dowolna liczba inna niż 0' '
ciąg ze spacją'00'
dwa lub więcej 0 znaków w ciągu"0\n"
0, po której następuje nowa linia'true'
'false'
tak, nawet ciąg „false” zwraca wartość true.Jest jeszcze jeden dobry samouczek, który wyjaśnia, jak Perl jest prawdziwy i fałszywy .
Piękne wyjaśnienie podane przez bobf dla wartości boolowskich: prawda czy fałsz? Skrócona instrukcja obsługi
Testy prawdy dla różnych wartości
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
użyj następującego przedrostka pliku, to doda do twojego skryptu perla eTRUE i eFALSE, w rzeczywistości będzie to PRAWDZIWE (!) prawdziwe i fałszywe (tak jak java)
#!/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' )
};
Jest tak naprawdę kilka powodów, dla których powinieneś tego używać.
Moim powodem jest to, że pracując z JSON, mam 0 i 1 jako wartości kluczy, ale ten hack upewni się, że prawidłowe wartości są zachowane wzdłuż twojego skryptu.