Правильные ответы уже даны (defined
- это то, как вы проверяете значение на определенность), но я хотел кое-что добавить.
В perlop вы прочтете это описание ne
:
Двоичный "ne" возвращает истину, если левый аргумент по строкам не равен
на правильный аргумент.
Обратите внимание на использование «stringwise». По сути, это означает, что, как и в случае других операторов, таких как ==
, где тип аргумента предопределен, любые аргументы в ne
будут эффективно преобразованы в строки перед выполнением операции. Это для размещения операций, таких как:
if ($foo == "1002") # string "1002" is converted to a number
if ($foo eq 1002) # number 1002 is converted to a string
Perl не имеет фиксированных типов данных и полагается на преобразование данных. В этом случае undef
(который по совпадению не является значением, это функция: undef()
, которая возвращает неопределенное значение) преобразуется в строку. Это преобразование вызовет ложные срабатывания, которые могут быть трудно обнаружить, если warnings
не действует.
Рассмотрим:
perl -e 'print "" eq undef() ? "yes" : "no"'
Будет выведено «да», хотя ясно, что пустая строка ""
не равна not defined
. Используя warnings
, мы можем поймать эту ошибку.
То, что вы хотите, это, вероятно, что-то вроде:
for my $url (@sites) {
last unless defined $url;
...
}
Или, если вы хотите перейти к определенному элементу массива:
my $start = 1;
for my $index ($start .. $#sites) {
last unless defined $sites[$index];
...
}
Тот же базовый принцип, но с использованием среза массива и без индексов:
my $start = 1;
for my $url (@sites[$start .. $#sites]) {
last unless defined $url;
...
}
Обратите внимание, что использование last
вместо next
является логическим эквивалентом вашего условия цикла while: Когда встречается неопределенное значение, цикл завершается.
Больше отладки: http://codepad.org/Nb5IwX0Q
Если вы, как и в этой вставке выше, распечатаете счетчик итераций и значение, вы будете достаточно четко видеть, когда появляются различные предупреждения. Вы получаете одно предупреждение для первого сравнения "a" ne undef
, одно для второго и два для последнего. Последние предупреждения появляются, когда $sitecount
превышает максимальный индекс @sites
, и вы сравниваете два неопределенных значения с ne
.