powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Вопрос по языку Perl (ссылки и конструктор)
12 сообщений из 12, страница 1 из 1
Вопрос по языку Perl (ссылки и конструктор)
    #38967319
janco
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Вот набрёл в учебнике на такое:
авторВ любой массив можно поместить список ссылок на другие программные объекты, например, таким образом:
Код: perl
1.
@reference_list = (\$scalar, \@array, \%hash);


Можно записать то же самое более простым способом, поставив операцию взятия ссылки перед списком объектов в круглых скобках
Код: perl
1.
@reference_list = \($scalar, @array, %hash);


Не могу понять, почему эти записи эквивалентны? В первом - список ссылок, во втором - ссылка на массив - откуда там берётся список ссылок? Я конечно понимаю, что списочный контекст, но в этом случае должен получиться список с одного элемента, содержащий ссылку на массив. Объясните, пожалуйста, что там происходит.

И ещё вопрос по ООП. Экземпляр класса создаётся вот так:
Код: perl
1.
my $hobbit = Person->new();


Но оператор -> это обращение к элементу по ссылке. А Person - это имя класса (пакета), а не ссылка, как тогда к нему может применяться оператор -> ? Или неправильно понимаю? Дальнейшее обращение к методам - это понимаю, потому что объект уже создан, т.е. имеется ссылка на него. А до создания? По логике вещей должно быть вот так:
Код: perl
1.
my $hobbit = Person::new();


так как Person - это пакет.
...
Рейтинг: 0 / 0
Вопрос по языку Perl (ссылки и конструктор)
    #38967343
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jancoНе могу понять, почему эти записи эквивалентны?Так решили создатели языка.
Читай тут: http://perldoc.perl.org/perlref.html#Making-References


jancoИ ещё вопрос по ООП.
...
так как Person - это пакет.Пакет это не класс. Пакет это уже сам по себе объект. Когда ты делаешь use P; ты уже создаешь синглтон P типа P.
И да, можно сделать:
Код: php
1.
2.
my $hobbit = Person->new();
my $orc = $hobbit->new();


Читать тут: http://perldoc.perl.org/perlobj.html
...
Рейтинг: 0 / 0
Вопрос по языку Perl (ссылки и конструктор)
    #38967380
janco
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlТак решили создатели языка.
Читай тут: http://perldoc.perl.org/perlref.html#Making-References

Спасибо.
С этим понятно. Решили так решили, только зачем такую глупость создавать для путаницы?..
White OwlПакет это не класс. Пакет это уже сам по себе объект.
А тут не понял. Можете ткнуть конкретно в то предложение в документации, где такое написано?
Я читаю:
perldocA class is simply a package. A class provides methods that expect to operate on objects.
Вы пишете что пакет это объект, они - что класс. Выходит объект и класс одно и то же. но это не так. Да и если бы пакет был объектом, то зачем тогда ещё вызвать конструктор?
White OwlИ да, можно сделать:
my $hobbit = Person->new();
my $orc = $hobbit->new();

Ну вторая инструкция мне понятна, так как $hobbit - это ссылка.
...
Рейтинг: 0 / 0
Вопрос по языку Perl (ссылки и конструктор)
    #38967414
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jancoС этим понятно. Решили так решили, только зачем такую глупость создавать для путаницы?..

нет, ничего тебе не понятно;
глупость.. Наехал на Ларри? это зря. совсем зря.


@reference_list = (\$scalar, \@array, \%hash);

в левой части списочная переменная,
налицо списочный контекст.

в правой перечисление. не массив, а перечисление; ( оператором перечисления является запятая )
если бы скобок не было, то в @reference_list попал бы только \%hash,
a вот со скобками попали все участники перечисления.

далее,
упоминаемый тобой автор пишет: "поставив операцию взятия ссылки перед списком объектов в круглых скобках"
и, надо отметить, правильно пишет, раз употребил слово операция;

если это операция, то бэкслэш - это префиксный оператор взятия адреса, а аргументы в круглых скобках - параметры этого оператора.

Ларри Уолл необычайно трепетно относится к языку и называть ажурность его построений глупостью - это юношеский максимализм в
самых его уродливых формах ))
...
Рейтинг: 0 / 0
Вопрос по языку Perl (ссылки и конструктор)
    #38967419
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
едем дальше;

Код: perl
1.
my $hobbit = Person->new();



забудь про C++, никакого отношения к C++ синтаксис Perl не имеет.

здесь оператор стрелка -> это просто синтаксис вызова метода об'екта
и означает он, что метод new получает при вызове первым аргументом строку "Person".

стрелка -> ещё используется в качестве синтактического сахара при разыменовании ссылок,
но это РАЗНЫЕ операции.
...
Рейтинг: 0 / 0
Вопрос по языку Perl (ссылки и конструктор)
    #38967436
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и ещё: кроме языка Perl5 , теперь есть язык Per l6
( и имеющий, кстати, такое же отношении к Perl5[/b] , как Perl5 к Python , например )

так вот, в Perl6 убраны все эти двусмысленные операторы,
он на два порядка стройнее, абсолютно об'ектен и синтаксисом вызова методов об'ектов
является, как это исторически сложилось в ЯП, [b].
- точка, никаких стрелок.
...
Рейтинг: 0 / 0
Вопрос по языку Perl (ссылки и конструктор)
    #38967449
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jancoWhite OwlПакет это не класс. Пакет это уже сам по себе объект.
А тут не понял. Можете ткнуть конкретно в то предложение в документации, где такое написано?
An Object is Simply a Data Structure
Да, "класс" это пакет. Но пакет это не "класс". Вернее это не класс в традиционном понятии этого слова. В традиционном ООП класс это просто шаблон описывающий какие данные будут хранится в объекте, и какие операции с этими данными можно делать.
А тут (в пакете) мы изначально имеем хеш массив который содержит и места под данные и функции.


janco Да и если бы пакет был объектом, то зачем тогда ещё вызвать конструктор?Чтобы создать еще один объект.
Если тебе нужен один-единственный объект во всей программе, то можно с легкостью обойтись одним глобальным (который и является загруженным пакетом).
...
Рейтинг: 0 / 0
Вопрос по языку Perl (ссылки и конструктор)
    #38968021
janco
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
volodin661едем дальше;
здесь оператор стрелка -> это просто синтаксис вызова метода об'екта
и означает он, что метод new получает при вызове первым аргументом строку "Person".

стрелка -> ещё используется в качестве синтактического сахара при разыменовании ссылок,
но это РАЗНЫЕ операции.
В этом и вся фишка - разные операции. Теперь вопрос решён. Я рассматривал как разыменование ссылок.

volodin661@reference_list = (\$scalar, \@array, \%hash);

в левой части списочная переменная,
налицо списочный контекст.
Ну и что? Я это предложение понимаю: там всё как должно быть - список ссылок. Не понятно вот это:
@reference_list = \($scalar, @array, %hash);
volodin661далее,
упоминаемый тобой автор пишет: "поставив операцию взятия ссылки перед списком объектов в круглых скобках"
и, надо отметить, правильно пишет, раз употребил слово операция;

если это операция, то бэкслэш - это префиксный оператор взятия адреса, а аргументы в круглых скобках - параметры этого оператора.
Какие параметры оператора? У оператора есть операнды, а раз \ - унарный оператор то у него может быть один операнд.
Далее, упоминаемый мною автор пишет:
авторСпособом представления значения списка в программе является списочный литерал, который записывается в виде последовательности значений, разделенных запятыми и заключенных в круглые скобки .
Т.е. скобки вместе с запятой описывают перечисление, а не являются разделителем аргументов. Это же не функция.
($scalar, @array, %hash) - список
Если к нему применить оператор \ то должна возвращаться одна ссылка на список , а получаются 3 ссылки на три элемента списка. Ну если такие "магические" непонятно чем объяснимые превращения - это трепетное отношение к языку - так тому и быть. Я не порицаю Уолла - как сделал, так сделал. Это его право как автора. Я хочу понять, можно ли объяснить как и почему ссылка на список превращается в список ссылок?
Спасибо.
...
Рейтинг: 0 / 0
Вопрос по языку Perl (ссылки и конструктор)
    #38968291
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
janco($scalar, @array, %hash) - список

нет. это не список. это перечисление.

можешь проверить
Код: php
1.
$s = ("ааа", "бббб", "цццц");


если справа список, то значением $s будет 3, а если нет, то последний член

но в списочном контексте, да, перечисление вернёт список.

оператор \ применённый к перечислению в списочном контексте вернёт список ссылок.
оператор \ применённый к перечислению в скалярном контексте вернёт ссылку на последний операнд

оператор \ применённый к списочной переменной в круглых скобках \(@list) в списочном контексте вернёт список ссылок членов списка
(в качестве особого случая).

оператор \ применённый к хэш-переменной в круглых скобках \(%hash) в списочном контексте вернёт список ссылок на ключи и значения
(в качестве особого случая).
...
Рейтинг: 0 / 0
Вопрос по языку Perl (ссылки и конструктор)
    #38969228
janco
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
volodin661оператор \ применённый к перечислению в списочном контексте вернёт список ссылок.

Спасибо, но Вы мне констатируете то, что есть. Я это уже прочитал в учебнике. Вопрос стоит почему и каким магическим превращением это происходит ?
Или спрошу по другому: какое выражение надо написать, чтобы получить ссылку на список переменных ?
Вы пишете:
volodin661оператор \ применённый к перечислению в скалярном контексте вернёт ссылку на последний операнд

Как получить ссылку не на последний операнд, а на всё перечисление?
...
Рейтинг: 0 / 0
Вопрос по языку Perl (ссылки и конструктор)
    #38969255
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jancovolodin661оператор \ применённый к перечислению в списочном контексте вернёт список ссылок.

Спасибо, но Вы мне констатируете то, что есть. Я это уже прочитал в учебнике. Вопрос стоит почему и каким магическим превращением это происходит ?
Или спрошу по другому: какое выражение надо написать, чтобы получить ссылку на список переменных ?
Вы пишете:
volodin661оператор \ применённый к перечислению в скалярном контексте вернёт ссылку на последний операнд

Как получить ссылку не на последний операнд, а на всё перечисление? http://perldoc.perl.org/perlref.html#Making-References
...
Рейтинг: 0 / 0
Вопрос по языку Perl (ссылки и конструктор)
    #38969355
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jancoКак получить ссылку не на последний операнд, а на всё перечисление?

WhiteOwl уже дал ссылку, но на соответств. документацию;

отвечу конкретно
Код: php
1.
$listref = ["a","b","c"];
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Вопрос по языку Perl (ссылки и конструктор)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]