![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| PSForRealms |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 13.10.2010 Репутация: нет Всего: нет |
Добрый день!
Прошу помощи у знатоков. Я сейчас только изучаю perl по книге "Программирование на PERL" и возник вопрос по одному простому примеру. Никак не могу понять, почему эти примеры дают разные результаты: 1) ($a, $b) = (4, 5); $y = ($a, $b); print "$y\n"; #Вывод 5 - последний элемент списка, это я еще понимаю. 2) $y = (($a, $b) = (4, 5)); print "$y\n"; #Вывод 2 - число элементов в списке Объясните пожалуйста разницу своими словами. В книге в разделе "Присвоение спискам" подобный пример, но мне все равно не понятно. Спасибо! |
|||
|
||||
| Jimy |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 4.7.2010 Репутация: нет Всего: 3 |
В списочном контексте присваивание списку возвращает список новых значений. В скалярном контексте присваивание списку возвращает ЧИСЛО ЗНАЧЕНИЙ, ИМЕВШИХСЯ В ПРАВОЙ ЧАСТИ ПРИСВАИВАНИЯ.
$y будет равен 4. |
|||
|
||||
| PSForRealms |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 13.10.2010 Репутация: нет Всего: нет |
Все равно не доходит
Т.е. ($a, $b) = (1, 3, 5, 7) - это у нас "списочном контексте присваивание списку", что дает список значений $y = (($a, $b) = (1, 3, 5, 7)) - это "В скалярном контексте присваивание списку", которое в итоге дает 4. Хорошо, а что тогда вот это $y = ($a, $b) ? На мой взгляд это тот же список в скалярном контексте из-за отсутствия скобок вокруг $y. Но, почему то это не так... Вообще, я, наверное, рассуждаю наивно, полагая, что выражение $y = (($a, $b) = (4, 5)) после вычисления внутри скобок должно придти к виду $y = ($a, $b) ?? |
|||
|
||||
| Jimy |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 4.7.2010 Репутация: нет Всего: 3 |
без скобок уже не список, в данном случае именно они определяют контекст. Здесь список присваивается скаляру. В данном случае в $y попадает последнее значение из списка.
Нет, в $y попадает то, что вернет знак "=" (а он в данном случае возвращает количество значений в правой части). Сначала выполнится действие в общих скобках (общие скобки здесь определяют не списочный контекст, а приоритет операций), а затем результат данной операции будет присвоен $y. Не знаю как объяснить по-другому. Добавлено через 8 минут и 34 секунды
ДА, все верно. Хочу еще добавить, может станет понятней. Знак "=" помимо того что он выполняет присваивание, он также еще сам возвращает значение. |
||||||
|
|||||||
| PSForRealms |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 13.10.2010 Репутация: нет Всего: нет |
Все равно не до конца понятно, будем считать, что я медленный газ. Почитаю дальше, со временем разберусь, наверное)) Пока, просто запомню, что если есть строка
где справа список, слева скаляр
то это присвоение списка в скалярном контексте, где возвращается последний элемент списка а, если в правой части находится сложное выражение результат которого список
то возвращается число элементов списка. Можно так рассуждать? И еще, в книге по этому поводу написано: "Присвоение спискУ в скалярном контексте возвращает число элементов" Как контекст может быть скалярным, если список в левой части уже устанавливает его списочным?? Может это опечатка и должно быть Присвоение спискА в скалярном контексте?? |
||||
|
|||||
| PSForRealms |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 13.10.2010 Репутация: нет Всего: нет |
Все, дошло до меня
Спасибо всем, кто помогал и верил в меня))) Если надо могу объяснить |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |