Вопрос по perl, variables – Почему переменные Perl должны начинаться с $,%, @ (сигилы)?

23

Почему переменные Perl должны начинаться с разных символов (сигилов)?

Scalar variables start with $

Hashes start with %

Arrays start with @

Почему они такие?

Вы спрашиваете, почему именно эти сигилы были выбраны (в отличие от трех разных)? Или почему вообще есть сигилы? Thilo
Я спросил только о сигилах, а потом понял, почему другие переменные тоже такие. так я спросил обо всем? joe
Краткий ответ: они не & # x2019; т. Рассмотрим массивы и хэши. Тем не менее, вопрос сбивает с толку. Хотите уточнить? Konrad Rudolph

Ваш Ответ

6   ответов
11
Because Perl was intended to replace shell scripts, and variables in shell start with $. To distinguish between scalars ($), arrays (@) and hashes (%).
Я бы не сказал, что perl предназначен для замены сценариев оболочки и поэтому сохранил$ sigil (переменная оболочки POSIX фактически инициализируется без$) - польза от$ sigil - это то, что вы можете использовать / интерполировать переменные без слишком большого трюка с переключением контекста в вашем коде, напримерecho "the value of variable foo is $foo" (в отличие отSystem.out.println("the value of foo is" + foo) и это настолько, насколько perl и shell разделяют общность. Perl & APOS; s$ sigil больше подходит к вашей второй точке (обозначает тип / использование переменной)
59

мне объяснили, что эти символы были выбраны потому, что:

$ looked a bit like an 's' so that was for scalars, @ has an 'a' in the middle so that was for arrays, and % was for hashes because it looked like a key-value pair divided by a slash.
Да, верблюжья книга рассказывает ту же историю. Или, по крайней мере, это не говорит о том, что они действительно были выбраны по этим причинам, но вы могли бы лучше вспомнить, что они обозначают с помощью этой мнемоники.
Я также думаю, что% выглядит немного как "H" для хэша, если вы используете много поэтической лицензии.
Интересный ответ :-) joe
После того, как много напитков @MatthewLock? :-)
11

http://www.wall.org/~larry/natural.html:

English uses number and word order, with vestiges of a case system in the pronouns: "The man looked at the men, and they looked back at him." It's perfectly clear in that sentence who is doing what to whom. Similarly, Perl has number markers on its nouns; that is, $dog is one pooch, and @dog is (potentially) many. So $ and @ are a little like "this" and "these" in English.

22

объяснил Ларри Уоллом и соавторами в «Программировании на Perl»:

Within any given namespace [...] every variable type has its own subnamespace, determined by the funny character. You can, without fear of conflict, use the same name for a scalar variable, an array, or a hash (or, for that matter, a filehandle, a subroutine matter, a label or your pet llama.)

[...]

Like most computer languages, Perl has a list of reserved words that it recognizes as special keywords. However, because variable names always start with a funny character, reserved words don't actually conflict with variable names.

Защита пространства имен - это главное преимущество сигил, IMO. ++!
@cftarnas: Я надеюсь, что в вашем комментарии есть несколько ошибок, а не правильное использование языка. Я действительно не знаю, потому что я только начинаю изучать Perl. В любом случае, если ваша цель состояла в том, чтобы продемонстрировать, что использование символов в Perl не сбивает с толку, я не думаю, что вы добились успеха. Возможно, люди, которые имеютalready мастер Perl не согласится со мной
Не факт, что вы также можете использовать переменные в разных «контекстах»? сделать вещи ужасно запутанными? Разве это не делает невозможным использование одного и того же имени для разных переменных?
Это делает Perl Lisp 4 (или 5, если вы считаете * GLOB)
@ temp2290 Нет. Рассмотрим@arr а также$arrэто две разные переменные. Когда, например, вы используете@arr в скалярном контексте вы либо получаете доступ к одному элементу:my $element = $arr[1] или длина массива:my $length = @arr;, В обоих случаях их легко отличить от скалярной переменной$arr, Если$arr была скалярная ссылка на массив, вы могли бы сделатьmy $element = $arr->[0]; а также$length = @$arr;, ИМХО хотя бы те все легко различимы.
2

Это дизайнерское решение, чтобы пометить их как переменные, а также обозначить их тип.

Обратите внимание, что вы можете иметь как$abc и%abc.

Проверьтеучебник по переменным Perl.

@ Дэвид: действительная проблема. Я думаю, что Рэй Курцвейл работает над этой проблемой. ;-)
Это несоответствие будет исправлено в Perl6, где вы пишете @abc [1] для доступа ко второму элементу в массиве @abc.
@ Дэвид Торнли: Надеюсь, ты еще приедешь весной 2010 года! (h-online.com/open/Perl-6-due-in-spring-2010-some-of-it-anyway--/…)
Символы не обозначают тип. Они обозначают, как вы относитесь к штуковине. Например, $ abc [1] все еще использует переменную массива, даже если есть $ out.
Предположим, что любой из нас живет достаточно долго, чтобы увидеть полный релиз Perl 6.
35

сигилы:

In computer programming, a sigil (pronounced /'sɪdʒ.ɪl/ or /'sɪg.ɪl/; plural sigilia or sigils) is a symbol attached to a variable name, showing the variable's datatype or scope. The term was first applied to Perl usage by Philip Gwyn in 1999 to replace the more cumbersome "funny character in front of a variable name". The name is based on the word meaning a magical symbol (see sigil (magic)).

Похожие вопросы