В чем разница между `$ this`,` @ that` и `% Те` в Perl? - PullRequest
41 голосов
/ 28 апреля 2010

В чем разница между $this, @that и %those в Perl?

Ответы [ 5 ]

39 голосов
/ 28 апреля 2010

Полезная мнемоника для символов Perl:

  • $ Calar
  • @ rray
  • % золы

Мэтт Траут написал отличный комментарий к blog.fogus.me о символах Perl, который, я думаю, полезен, поэтому вставил ниже:

На самом деле, символы perl не обозначают тип переменной - они обозначают сопряжение - $ - это ',' @ - это «Эти»,% - это «карта» или около того - тип переменной обозначается через [] или {}. Вы можете увидеть это с помощью:

my $foo = 'foo';
my @foo = ('zero', 'one', 'two');
my $second_foo = $foo[1];
my @first_and_third_foos = @foo[0,2];
my %foo = (key1 => 'value1', key2 => 'value2', key3 => 'value3');
my $key2_foo = $foo{key2};
my ($key1_foo, $key3_foo) = @foo{'key1','key3'};

поэтому, глядя на сигил, когда скимминг perl-кода говорит вам, что вы собираетесь, скорее больше, чем то, над чем вы работаете.

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

Вы, конечно, все еще имеете право ненавидеть это, но это интересная концепция, и я Я полагаю, что вы предпочитаете ненавидеть то, что происходит на самом деле, а не то, что вы думали продолжается :)

23 голосов
/ 28 апреля 2010

$this - скалярное значение, оно содержит 1 элемент, такой как apple

@that - это массив значений, он содержит несколько таких символов, как ("apple", "orange", "pear")

%those - это хэш значений, он содержит пары ключей-значений, такие как ("apple" => "red", "orange" => "orange", "pear" => "yellow")

См. perlintro для получения дополнительной информации о типах переменных Perl.

8 голосов
/ 28 апреля 2010

Люди часто пытаются связать сигилы с переменными типами, но они только слабо связаны. Это тема, которую мы очень сильно затронули в Изучение Perl и Эффективное программирование на Perl , потому что гораздо легче понять Perl, когда вы понимаете символы.

Многие люди забывают, что переменные и данные на самом деле являются отдельными вещами. Переменные могут хранить данные, но вам не нужны переменные для использования данных.

$ обозначает одно скалярное значение (не обязательно скалярная переменная):

$scalar_var
$array[1]
$hash{key}

@ обозначает несколько значений. Это может быть массив в целом, фрагмент или разыменование:

@array;
@array[1,2]
@hash{qw(key1 key2)}
@{ func_returning_array_ref };

% обозначает пары (ключи и значения), которые могут быть хеш-переменной или разыменованием:

%hash
%$hash_ref

В Perl v5.20 % теперь может обозначать срез ключа / значения или хеш или массив:

%array[ @indices ];  # returns pairs of indices and elements
%hash{ @keys };      # returns pairs of key-values for those keys
8 голосов
/ 28 апреля 2010

Изобретатель Perl был лингвистом, и он стремился сделать Perl «естественным языком».

Из этот пост :

Устранение неоднозначности по номеру, регистру и порядку слов

Одна из причин, по которой язык может избежать определенных локальных неопределенностей, заключается в том, что другие неопределенности подавляются различными механизмами. В английском языке используется номер и порядок слов с остатками падежной системы в местоимениях: «Мужчина смотрел на мужчин, а они смотрели на него назад». В этом предложении совершенно ясно, кто что делает для кого. Точно так же Perl имеет числовые маркеры на своих существительных; то есть $ dog - это один пес, а @dog - (потенциально) много. Так что $ и @ немного похожи на «это» и «эти» в английском . [выделение добавлено]

4 голосов
/ 28 апреля 2010

Возможно, вы захотите взглянуть на документы perlintro и perlsyn, чтобы по-настоящему начать понимать Perl (т. Е. Прочитать Руководство по перелистыванию). : -)

Это говорит:

  • $this - скаляр, который может хранить число (int или float), строку или ссылку (см. Ниже);
  • @that - это массив, в котором может храниться упорядоченный список скаляров (см. Выше). Вы можете добавить скаляр в массив с помощью функций push или unshift (см. perlfunc), и вы можете использовать ограниченный скобками список разделенных запятыми скалярных литералов или переменных для создания литерала массива (т. Е. my @array = ($a, $b, 6, "seven");)
  • %those - это хеш, который является ассоциативным массивом. Хэши имеют пары записей ключ-значение, так что вы можете получить доступ к значению хэша, указав его ключ. Хеш-литералы также могут быть определены во многом как списки, за исключением того, что каждая нечетная запись является ключом, а каждый четный - значением. Вы также можете использовать символ => вместо запятой для разделения ключа и значения. (т. е. my %ordinals = ("one" => "first", "two" => "second");)

Обычно, когда вы передаете массивы или хэши вызовам подпрограмм, отдельные списки сводятся в один длинный список. Это иногда желательно, иногда нет. В последнем случае вы можете использовать ссылки для передачи ссылки на весь список в виде одного скалярного аргумента. Синтаксис и семантика ссылок сложны, и выходят за рамки этого ответа. Если вы хотите проверить это, см. perlref.

...