The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Самопроизвольное создание Перлом элементов массива"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Perl)
Изначальное сообщение [ Отслеживать ]

"Самопроизвольное создание Перлом элементов массива"  +/
Сообщение от GaidukAV email on 07-Июл-14, 08:44 
есть тестовый код:


use strict;
use Data::Dumper;
my @a = qw(a b c);
print scalar(@a), "\n", Dumper(@a), "\n";
if ( $a[5]->[1]->[0] ) { die; }
print scalar(@a), "\n", Dumper(@a), "\n";

после его выполнения получаем:


3
$VAR1 = 'a';
$VAR2 = 'b';
$VAR3 = 'c';

6
$VAR1 = 'a';
$VAR2 = 'b';
$VAR3 = 'c';
$VAR4 = undef;
$VAR5 = undef;
$VAR6 = [
      undef,
      []
];

почему в массиве появились новые элементы?

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Самопроизвольное создание Перлом элементов массива"  +/
Сообщение от Andrey Mitrofanov on 07-Июл-14, 09:45 
> if ( $a[5]->[1]->[0] ) { die; }

if ( defined($a[5]) && defined($a[5]->[1]) && defined($a[5]->[1]->[0]) && $a[5]->[1]->[0] ) { die; }

> почему в массиве появились новые элементы?

Потому что ты их создал!

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Самопроизвольное создание Перлом элементов массива"  +/
Сообщение от GaidukAV email on 07-Июл-14, 15:52 
>> if ( $a[5]->[1]->[0] ) { die; }
> if ( defined($a[5]) && defined($a[5]->[1]) && defined($a[5]->[1]->[0]) && $a[5]->[1]->[0]
> ) { die; }
>> почему в массиве появились новые элементы?
> Потому что ты их создал!

Странная логика...
Функция ПРОВЕРКИ изменяет проверяемое значение - прям квантовая механика...
Если не сложно, ткните, где можно об этом почитать?
perlfunc defined - ничего не проясняет.

И каким же тогда способом проверить наличие опциональных полей у элемента массива?

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Самопроизвольное создание Перлом элементов массива"  +/
Сообщение от Andrey Mitrofanov on 07-Июл-14, 16:45 
>>> if ( $a[5]->[1]->[0] ) { die; }
>> if ( defined($a[5]) && defined($a[5]->[1]) && defined($a[5]->[1]->[0]) && $a[5]->[1]->[0]
>> Потому что ты их создал!
> Странная логика...

Я не объясняю логику. Я пою то, что вижу: обращение к несуществующему элементу массива создало этот элемент с каким-то undef-ом в качестве значения.

> Функция ПРОВЕРКИ изменяет проверяемое значение - прям квантовая механика...

Самые обычные _побочные эффекты.

> Если не сложно, ткните, где можно об этом почитать?
> perlfunc defined - ничего не проясняет.

Без понятия. Я перла _вообще не знаю. И этот defined() в гугле на чём-то вроде stackoverflow нашёл. Ну, набери <perl defined> в гугле.

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Самопроизвольное создание Перлом элементов массива"  +/
Сообщение от XAnder (ok) on 08-Июл-14, 13:26 
> почему в массиве появились новые элементы?

См. http://perldoc.perl.org/perlref.html на предмет "autovivification". А в книге "Intermediate Perl" (у нас вышла под названием "Perl: изучаем глубже") этому целая глава посвящена. Рекомендую.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

5. "Самопроизвольное создание Перлом элементов массива"  +/
Сообщение от GaidukAV email on 09-Июл-14, 12:47 
>> почему в массиве появились новые элементы?
> См. http://perldoc.perl.org/perlref.html на предмет "autovivification".

autovivification !!!
Спасибо, теперь зная "почему оно так" - многое стало понятным.

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру