Почему у @my_array = undef есть элемент? - PullRequest
4 голосов
/ 17 июня 2009
@my_array = undef;
if (@my_array ) {  
    print 'TRUE'; 
} else {
    print 'FALSE';
}

Будет напечатано TRUE

Почему в массиве есть элемент?

Ответы [ 3 ]

25 голосов
/ 17 июня 2009

Массив имеет элемент, потому что вы его присвоили. Учтите следующее:

@array = undef;  # Assigns the value 'undef' to @array
@array = ();     # Assigns the empty list to @array
undef @array;    # Undefines @array

Они похожи, но первая строка отличается от двух других (которые эквивалентны). Первая строка приводит к массиву с одним элементом (значение undef). Два других результата в пустом массиве. В Perl undef является одновременно значением и оператором. Первая строка использует его как значение, последняя строка использует его как оператор.

Обычно нет необходимости очищать массив. Они пусты при объявлении:

my @array;  # There's nothing in here, yet
11 голосов
/ 17 июня 2009

См. Что такое Истина? , чтобы узнать больше о булевых значениях в Perl. (Если вы переходите с другого языка, вас могут ожидать еще несколько сюрпризов, поэтому его стоит прочитать.)

Вот ключевой бит из статьи:

defined и undef хороши для тестирование и установка скаляров. Не пытайся их с массивами, хотя. На данный момент, defined(@array) возвращает true, если Perl выделил хранилище для массива что-то странное и бесполезное среднестатистическому программисту. Возвращать массив в исходное состояние, мы говорим:

@array = ();        # good

Сказать @array = undef значит сделать @array содержит одноэлементный список, с единственный элемент, являющийся скалярным значением undef. Это почти никогда не то, что мы хочу.

Еще один совет: локализуйте свои переменные с помощью my: my @array = (#whwhat);

8 голосов
/ 17 июня 2009

В Perl undef является допустимым значением. Вы можете поместить один (или любое число) из undef s в массив или список.

Если вы хотите удалить все элементы массива, сделайте следующее:

@my_array = ();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...