Почему @my_array = undef имеет элемент?

@my_array = undef;
if (@my_array ) {  
    print 'TRUE'; 
} else {
    print 'FALSE';
}

Это напечатает TRUE

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

perl,arrays,

4

Ответов: 3


25 ов принято

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

@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 ов

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

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

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

@array = ();        # good

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

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


8 ов

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

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

@my_array = ();
Perl, массивы,
Похожие вопросы
Яндекс.Метрика