Prawidłowe odpowiedzi zostały już podane (defined
sposób można sprawdzić wartość definedness), ale chciałem coś dodać.
W perlop będziesz czytać ten opis ne
:
Binary „ne” zwraca prawdę, jeśli lewy argument nie jest łańcuchowo równy do prawego argumentu.
Zwróć uwagę na użycie "stringwise". Zasadniczo oznacza to, że podobnie jak w przypadku innych operatorów, takich jak ==
, gdzie typ argumentu jest wstępnie zdefiniowany, wszelkie argumenty do ne
zostaną skutecznie przekonwertowane na ciągi przed wykonaniem operacji. Ma to na celu pomieścić operacje, takie jak:
if ($foo == "1002") # string "1002" is converted to a number
if ($foo eq 1002) # number 1002 is converted to a string
Perl nie ma stałego typy danych, a polega na konwersji danych. W tym przypadku, undef
(który przypadkowo nie jest wartością, jest to funkcja: undef()
, która zwraca niezdefiniowaną wartość), jest konwertowana na ciąg znaków. Ta konwersja spowoduje fałszywe alarmy, które mogą być trudne do wykrycia, jeśli warnings
nie będzie działać.
Rozważmy:
perl -e 'print "" eq undef() ? "yes" : "no"'
To będzie drukować "tak", choć wyraźnie pusty ciąg ""
nie jest równa not defined
. Korzystając z warnings
, możemy złapać ten błąd.
Co chcesz, to prawdopodobnie coś jak:
for my $url (@sites) {
last unless defined $url;
...
}
Albo, jeśli chcesz przejść do pewnego elementu tablicy:
my $start = 1;
for my $index ($start .. $#sites) {
last unless defined $sites[$index];
...
}
samej zasadzie proste, ale stosując plaster tablicy i unikanie indeksów:
my $start = 1;
for my $url (@sites[$start .. $#sites]) {
last unless defined $url;
...
}
Należy pamiętać, że użycie last
zamiast next
jest logicznym odpowiednikiem warunku pętli while: Po napotkaniu niezdefiniowanej wartości pętla zostaje zakończona.
Więcej debugowanie: http://codepad.org/Nb5IwX0Q
Jeśli, podobnie jak w powyżej tej pasty, wydrukować licznik iteracji i wartości, będzie wyraźnie zobaczyć, kiedy pojawiają się różne ostrzeżenia. Otrzymujesz jedno ostrzeżenie dla pierwszego porównania "a" ne undef
, jedno dla drugiego i dwa dla ostatniego. Ostatnie ostrzeżenia przychodzą, gdy $sitecount
przekracza indeks maks. @sites
, a porównujesz dwie niezdefiniowane wartości z ne
.
I: Z góry dzięki – 11684
Mat: dzięki za wyróżnienie – 11684
Na czym polega pytanie? –