Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос начинающего, в чем разница между присвоениями спискам 
V
    Опции темы
PSForRealms
Дата 13.10.2010, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 - число элементов в списке

Объясните пожалуйста разницу своими словами. В книге в разделе "Присвоение спискам" подобный пример, но мне все равно не понятно.

Спасибо!
PM MAIL   Вверх
Jimy
Дата 13.10.2010, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 4.7.2010

Репутация: нет
Всего: 3



В списочном контексте присваивание списку возвращает список новых значений. В скалярном контексте присваивание списку возвращает ЧИСЛО ЗНАЧЕНИЙ, ИМЕВШИХСЯ В ПРАВОЙ ЧАСТИ ПРИСВАИВАНИЯ.
Код

$y = (($a, $b) = (1, 3, 5, 7));

$y будет равен 4.
PM   Вверх
PSForRealms
Дата 14.10.2010, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 13.10.2010

Репутация: нет
Всего: нет



Все равно не доходит smile 
Т.е. 

($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) ??



PM MAIL   Вверх
Jimy
Дата 14.10.2010, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 4.7.2010

Репутация: нет
Всего: 3



Цитата(PSForRealms @ 14.10.2010,  12:07)
Хорошо, а что тогда вот это $y = ($a, $b) ? 

На мой взгляд это тот же список в скалярном контексте из-за отсутствия скобок вокруг $y.

без скобок уже не список, в данном случае именно они определяют контекст. Здесь список присваивается скаляру. В данном случае в $y попадает последнее значение из списка.

Цитата

Вообще, я, наверное, рассуждаю наивно, полагая, что выражение $y = (($a, $b) = (4, 5)) после вычисления внутри скобок должно придти к виду $y = ($a, $b) ??


Нет, в $y попадает то, что вернет знак "=" (а он в данном случае возвращает количество значений в правой части). Сначала выполнится действие в общих скобках (общие скобки здесь определяют не списочный контекст, а приоритет операций), а затем результат данной операции будет присвоен $y.
Не знаю как объяснить по-другому.

Добавлено через 8 минут и 34 секунды
Цитата(PSForRealms @ 14.10.2010,  12:07)

На мой взгляд это тот же список в скалярном контексте из-за отсутствия скобок вокруг $y.

ДА, все верно. Хочу еще добавить, может станет понятней. Знак "=" помимо того что он выполняет присваивание, он также еще сам возвращает значение.
PM   Вверх
PSForRealms
Дата 15.10.2010, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 13.10.2010

Репутация: нет
Всего: нет



Все равно не до конца понятно, будем считать, что я медленный газ. Почитаю дальше, со временем разберусь, наверное)) Пока, просто запомню, что если есть строка 

где справа список, слева скаляр 
Код

$y = ($a, $b, $c)

то это присвоение списка в скалярном контексте, где возвращается последний элемент списка

а, если в правой части находится сложное выражение результат которого список
Код

$y = (($a, $b) = (1, 3, 5, 7));

то возвращается число элементов списка.

Можно так рассуждать?

И еще, в книге по этому поводу написано:
"Присвоение спискУ в скалярном контексте возвращает число элементов"
Как контекст может быть скалярным, если список в левой части уже устанавливает его списочным??
Может это опечатка и должно быть Присвоение спискА в скалярном контексте??




PM MAIL   Вверх
PSForRealms
Дата 18.10.2010, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 13.10.2010

Репутация: нет
Всего: нет



Все, дошло до меня smile 
Спасибо всем, кто помогал и верил в меня)))
Если надо могу объяснить smile 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0466 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.