LINUX.ORG.RU

Вопрос по синтаксису perl

 


0

2

Я не понимаю, зачем в перл используются $ в начале переменых? В других языках, таких как sh, tcl, эти знаки имеют определенно семантическое значение. Мы a=1 либо получаем имя переменной a, либо значение $a. А в Перле это для красоты чтоли?

В перле есть синтаксические конструкции, в которых barewords (идентификаторы без сигила) трактуются как строки, что позволяет экономить кавычки. Например

my %hash;
$hash{x} = 'y';
или
my %hash = ( x => 'y );

annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 1)
Ответ на: комментарий от router

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

Вообще говоря нет, объект в Perl - это ссылка связанная с пакетом. Методы объекта - функции из пакета. Т.е. это не

ссылка специальным образом оформленный хэш.

это может быть ссылка на скаляр или массив или на хэш, оформлять данные специальным образом не нужно, нужно сказать к какому пакету они принадлежит (через bless)

pru-mike ★★
()

Это контекст, в котором ты используешь переменную. $ - скалярный контекст(один элемент), @ - контекст массива(данный контекст может содержать несколько элементов), % - контекст хэша(пары ключ=>значение).
Естественно, чтобы получить одно отдельное значение, лучше использовать скалярный контекст. В контексте нескольких значений(какой-то диапазон из массива), используешь контекст массива. И т.д.
Можно и в контексте массива конечно, получить одно единственное значение из него. Но ты же не будешь называть одну единственную ложку в множественном числе?
Ларри он лингвист, потому уверен что это решение пришло как раз таки из опыта изучения естественных языков человеков.
Я для себя запомнил как-то так. Может и не совсем верно идеологически, но мне пофиг.

UPD: Ну и конечно, эти контексты позволяют иметь такие ништяки, как разные пространства имён для разных типов переменных. Но это вряд ли можно назвать преимуществом, просто фича.

nexfwall ★★★★
()
Последнее исправление: nexfwall (всего исправлений: 1)

Я не понимаю, зачем в перл используются $ в начале переменых?

Программирование на Perl, 4 издание, 2014. с.101, глава Контекст.

Deleted
()
Ответ на: комментарий от nexfwall

это решение пришло как раз таки из опыта изучения естественных языков человеков.

Фигня-с... В классическом бейсике было тоже самое, только не в префиксном виде, а в постфиксном.

chuzhoi
()
Ответ на: комментарий от nexfwall

Ну и конечно, эти контексты позволяют иметь такие ништяки

Да какие ништяки? Из-за контекстов Перл считается (и является) уродским и переусложненным. Посмотри любой более-менее сложный код - почти всё на ссылках-скалярах. И как следствие ожесточенная синтаксическая борьба с контекстами. А также утонченный изврат, когда функции возвращают разные значения в зависимости от контекста.

Hjorn
()
Ответ на: комментарий от Hjorn

А также утонченный изврат, когда функции возвращают разные значения в зависимости от контекста.

Вообще то это вполне нормальное поведение для динамического биндинга.

terminator-101
() автор топика
Ответ на: комментарий от terminator-101

В случае же перла, сразу по идентификатору можно определить, что это переменная (и тип переменной), т.е

Да. Венгерская нотация на уровне компилятора. И секас с приведением контекстов и дереференсингом. В общем Ларри - одаренный (альтернативно, да).

Hjorn
()
Ответ на: комментарий от terminator-101

Вообще то это вполне нормальное поведение для динамического биндинга

Что же тут нормального, когда значение функции зависит не только от аргументов, а ещё и от формы её вызова? Получаем под одним именем набор функций, порой с кардинально отличной семантикой. Такой себе хитровывернутый полиморфизм.

Hjorn
()
Ответ на: комментарий от Hjorn

Я говорю, что это нормально, когда мы имеем в языке динамическое связывание. Так же и лиспы все работали, до того как появился scheme. Динамическое связывание не хуже, оно просто другое. Весь софт для ИИ так писался, и никто не жаловался.

terminator-101
() автор топика
Ответ на: комментарий от Hjorn

Получаем под одним именем набор функций, порой с кардинально отличной семантикой.

приведи конкретный пример когда это так.

Deleted
()
Ответ на: комментарий от Hjorn

Из-за контекстов Перл считается (и является) уродским и переусложненным.

имхо это фишка языка. и что сложного? это же не тысячи контекстов. максимум 5-7, из которых основные в использовании $,@, и иногда %.

Deleted
()
Ответ на: комментарий от ziemin

ИМХО «vvedite @{[$var + 1]}-iy item» Ну не знаю... Атмосфернее что ли.

На самом деле гораздо проще: оператор "shopping-cart" используется для создания полностью интерпретируемого контекста внутри строки. Чаще всего это надо, чтоб подставить результат функции/константу в строку (привет sprintf).

Да и вообще, никакой это не оператор, просто совпадение: @{} — «разыменование массива», [] — создание массива и ссылки на него. Т.е. создаем массив, получаем ссылку и тут же ее разыменовываем.

Вот тут еще куча интересных "операторов": http://search.cpan.org/dist/perlsecret/lib/perlsecret.pod

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 3)
Ответ на: комментарий от theNamelessOne
λ desktop ~ → perl
$x = 1;
print "${x + 1}"

как минимум надо было perl -w, а по-хорошему еще и use strict;. Тогда бы стало понятно.

KennyMinigun ★★★★★
()
Ответ на: комментарий от Hjorn

Таковы уж особенности языка. Или тут нам яро предлагаешь закопать перл, и перейти на недопетон?

nexfwall ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.