В чем разница между `$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
,