![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемые коллеги!
Извините за "детский" вопрос, но хочу для себя прояснить как работает объявление и инициализация внутри цикла:
На каждой итерации происходит только присвоение переменной $test нового значения, или что-то большее? Очень приветствуется ссылка на документацию! -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| GoDleSS |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 11.2.2007 Где: Пироговский Репутация: 2 Всего: 2 |
Для начала perldoc -f my
Функция my объявляет переменную локальной для текущего блока. Таким образом переменная, описанная my внутри цикла будет каждый раз "создаваться" по новой, а старые участки памяти будут стираться, за исключением случаев, когда на них уже что-либо ссылается. Таким образом код
выведет 14..23 Это сообщение отредактировал(а) GoDleSS - 20.3.2008, 15:45 --------------------
It's a nice day to die my friend! |
|||
|
||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
А вот такой дурацкий код что напечатает? Можете сказать, не проверяя? (Я бы не угадал
|
|||
|
||||
| BlackLFL |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 15.9.2005 Где: Москва Репутация: 8 Всего: 12 |
такой код в обще не должен дать результат, т.к. переменная $test не объявлена до инициализации.
|
|||
|
||||
| KSURi |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
То, что написал GoDleSS - логично, я всегда так и считал. Но вот сейчас начал сомневаться:
Меня смущает, что у всех $test один адрес в памяти. Если переменная каждый раз создается снова, то почему адрес всегда одинаковый? Это сообщение отредактировал(а) KSURi - 20.3.2008, 16:08 -------------------- Died at Life.pl line 21 |
|||
|
||||
| ginnie |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемый GoDleSS, на чем основана уверенность, что будет создаваться новая переменная? Спасибо за то, что навели на верную мысль!
код
выводит
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
||||
|
|||||
| BlackLFL |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 15.9.2005 Где: Москва Репутация: 8 Всего: 12 |
2ginnie, не успел запостить, я тоже провел аналогичный тест
Это сообщение отредактировал(а) BlackLFL - 20.3.2008, 16:12 |
||||
|
|||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
BlackLFL, почему не объявлена? Какая часть присваивания выполняется сначала левая или правая?
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| BlackLFL |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 15.9.2005 Где: Москва Репутация: 8 Всего: 12 |
тут это не имеет значения, Perl все-равно выдаст ошибку
Это сообщение отредактировал(а) BlackLFL - 20.3.2008, 16:15 |
||||
|
|||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
||||
|
||||
| BlackLFL |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 15.9.2005 Где: Москва Репутация: 8 Всего: 12 |
||||
|
||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Что-то я понимаю, нифига не понимаю. И по поводу переменной с my в цикле (вроде, каждый раз должна новая пременная создаваться, по крайней мере, работает, как будто так оно и есть, но так ли на самом деле ?). И с тем своим дурацким кодом тоже не вполне ясно, в какой последовательности операции выполняются.
Добавлено через 4 минуты и 20 секунд BlackLFL, но если сначала выполняется правая часть (я тоже в этом был уверен), то почему переменная в левой части оказывается неопределенной? |
|||
|
||||
| BlackLFL |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 15.9.2005 Где: Москва Репутация: 8 Всего: 12 |
amg, кстати да ... интересно получается ...
Добавлено @ 17:10 мне так кажется, что my имеет какое-то волшебное умение применять undef ... а сам интерпретатор, лишь "опирается" на my, для создания таблицы имен ... Это сообщение отредактировал(а) BlackLFL - 20.3.2008, 17:10 |
|||
|
||||
| ginnie |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
amg, похоже на то, что локальная переменная становится видна (кроме непосредственного присваивания) в коде только начиная со следующей команды (после ';') в коде программы.
Например, в коде
получаем Global symbol "$test" requires explicit package name в строке с условием По поводу цикла показателен следующий пример
Переменная создается один раз в области видимости, но при каждой итерации ей присваивается значение undef. -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
||||
|
|||||
| ginnie |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Дальнейшие исследования показали, что в коде
получаем результат
т.е. присваивание в цикле проиводится переменной $test, определенной выше цикла. -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
||||
|
|||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |