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

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

5 ответов

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

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

Matt Trout написал замечательный комментарий на 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-кода показывает, что вы собираетесь получить, а не то, над чем вы работаете, в значительной степени.

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

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

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

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

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

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

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

Из этого поста:

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

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

Люди часто пытаются связать сигилы с переменными типами, но они только слабо связаны. Это тема, которую мы очень сильно затронули в изучении 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

Вы можете посмотреть на perlintro а также perlsyn документы для того, чтобы по-настоящему начать понимать Perl (т. е. прочитать The Flipping Manual).:-)

Это говорит:

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

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

Другие вопросы по тегам