Имеют ли символы Perl какое-либо отношение к распределению памяти?

Возможный дубликат:
Почему Perl переменные должны начинаться с $, %,@?

Другие языки сценариев, кажется, прекрасно обходятся без этого или чего-то подобного.
Я думаю, это как-то связано с распределением памяти и помощью интерпретатору для ускорения работы, но я не смог найти ничего конкретного об этом. $scalar, вероятно, будет помещен в стек, @array в кучу и %hash? Тоже в кучу? А как насчет ?подпрограммы?
Может ли кто-нибудь помочь мне разобраться с этим или указать мне на какую-нибудь документацию? Я все еще пытаюсь понять некоторые основы и понять, как все работает под капотом...


person shutefan    schedule 03.08.2011    source источник
comment
Между прочим, эти символы называются сигилами.   -  person BoltClock    schedule 03.08.2011
comment
Пробелы и Brainf*ck, похоже, прекрасно уживаются без использования каких-либо буквенно-цифровых символов. Просто говорю.   -  person mob    schedule 03.08.2011
comment
Это должно быть домашним заданием. За три месяца я видел этот вопрос ровно один раз, вчера, здесь, на SO: ">здесь. Я предоставил один из ответов, и было несколько других хороших ответов. Тема была закрыта за то, что не по теме. Я чувствую запах домашней работы; вопросы слишком похожи, слишком близки друг к другу и слишком ориентированы на учащихся.   -  person DavidO    schedule 03.08.2011
comment
(Исправление: еще два раза: один был вчера, а другой указан @BoltClock в предыдущем комментарии здесь.)   -  person DavidO    schedule 03.08.2011
comment
Лучшее объяснение состоит в том, что $calar и @rray.   -  person sidyll    schedule 03.08.2011
comment
@DavidO Спасибо за ответ, я видел другой вопрос, на который вы ссылаетесь, и пришел к выводу, что он не требует того же.   -  person shutefan    schedule 03.08.2011
comment
Нет, они не имеют ничего общего с распределением памяти или оптимизацией скорости. Внутри скаляр, хеш или массив имеют разные структуры данных для хранения, но это не имеет ничего общего с тем, как выглядит язык.   -  person ysth    schedule 04.08.2011


Ответы (2)


Потому что так легче читать.

Вы знаете, какие идентификаторы являются существительными, в единственном или во множественном числе, благодаря сигалдрии. По той же причине в английском языке у нас есть определители единственного и множественного числа и согласование, как и в эти виды vs эти виды. Приятно знать, что есть что.

person tchrist    schedule 03.08.2011
comment
То есть вы бы сказали, что за этим нет никакой причины, кроме удобочитаемости? Это полностью направлено на программиста? - person shutefan; 03.08.2011
comment
Просто хотел убедиться, что я правильно понял ваш ответ. Как я указал в своем вопросе, вполне может быть, что сигилы являются идентификатором для интерпретатора, указывающим порядок размещения переменной в памяти. - person shutefan; 03.08.2011
comment
Чем это отличается? В любом случае, если вы не используете сигил, это будет выглядеть как пустая строка, запрещенная согласно use strict. Почему на оболочке есть символы? - person tchrist; 03.08.2011
comment
Зачем вам нужны int, str и т.д., например. С? Вам они точно не нужны, и в большинстве языков сценариев их нет. Вы помещаете их туда для компилятора. Опять же: вопрос не в том, что означают сигилы, а в том, имеют ли они какое-либо значение для интерпретатора. Если вы можете заверить, что они для программиста и только для удобства чтения, то я доволен этим. Вот почему я спросил вас, абсолютно ли вы уверены, что в этом нет ничего другого. Я никогда не сомневался в важности удобочитаемости или вашей зрелости. - person shutefan; 03.08.2011
comment
@shutefan: Сигилы используются читателем для быстрого понимания кода. Но они позволяют компилятору легко разрешать такие вещи, как интерполяция переменных, разыменование ссылок и различие между @abc и $abc, которые в Perl являются двумя разными переменными. Без сигил для интерполяции переменных потребуются некоторые другие метасимволы, для разыменования потребуются другие метасимволы, а abc не сможет одновременно быть строкой и полностью отдельным, независимым массивом, хэшем и функцией. Итак, чтобы ответить на ваш вопрос, да. Компилятор также использует сигилы. - person DavidO; 04.08.2011
comment
@DavidO: Большое спасибо! Извините, что не смог проверить ваш ответ на правильность, хотя... - person shutefan; 04.08.2011

Perl хранит все данные, связанные с именем, в одной записи таблицы символов. Хранящаяся там структура называется typeglob. Значения для $foo, @foo, %foo и &foo (ссылка на подпрограмму) хранятся в typeglob для "foo". Весь typeglob обозначается *foo (где * указывает на «все сигилы»). Все это объясняется в разделе perldata документации Perl.

person Ted Hopp    schedule 03.08.2011
comment
Да, но это на самом деле не объясняет, почему это сделано именно так. Существующая система означает, что существует (в основном невидимая) связь между $foo и @foo, и что вы можете использовать один и тот же идентификатор для скаляра и массива в одной и той же области видимости, но язык можно было легко разработать по-другому, без сигилы и с другой организацией таблицы символов (см., например, Python). Я думаю, что настоящая причина в том, что вы можете с первого взгляда сказать, глядя на имя переменной, что это за переменная. - person Keith Thompson; 03.08.2011
comment
Таблица символов применяется только к глобальным переменным пакета. Лексикалы (переменные my) используют лексические подушечки, которые спрятаны глубже во внутренностях Perl. перлгутс - person DavidO; 03.08.2011
comment
Настоящая причина заключается в том, чтобы отделить имена переменных от ключевых слов. Вам не нужно знать все ключевые слова, чтобы выбрать имя. - person brian d foy; 04.08.2011