Между чем различие $this
, @that
, и %those
в Perl?
Вы можете посмотреть документы perlintro
и perlsyn
, чтобы действительно начать понимать Perl (например, прочтите "Руководство по переворачиванию"). : -)
При этом:
$ this
- это скаляр, который может хранить число (int или float), строку или ссылку (см. Ниже); @that
- это массив, в котором может храниться упорядоченный список скаляров (см. выше). Вы можете добавить скаляр к массиву с помощью функций push
или unshift
(см. perlfunc
), и вы можете использовать список, разделенный запятыми, заключенный в круглые скобки. скалярные литералы или переменные для создания литерала массива (например, my @array = ($ a, $ b, 6, «семь»);
) % те
являются хешами, которые ассоциативный массив. Хэши имеют пары записей "ключ-значение", так что вы можете получить доступ к значению хэша, указав его ключ. Хеш-литералы также могут быть указаны во многом как списки, за исключением того, что каждая нечетная запись является ключом, а каждая четная - значением. Вы также можете использовать символ =>
вместо запятой для разделения ключа и значения. (например, my% ordinals = ("one" => "first", "two" => "second");
) Обычно, когда вы передаете массивы или хэши в вызовы подпрограмм, отдельные списки объединяются в один длинный список.Иногда это желательно, иногда нет. В последнем случае вы можете использовать ссылки для передачи ссылки на весь список как один скалярный аргумент. Однако синтаксис и семантика ссылок сложны и выходят за рамки этого ответа. Если вы хотите это проверить, см. perlref
.
Изобретатель Перла был лингвистом и стремился сделать Perl похожим на «естественный язык».
Из этот пост :
Устранение неоднозначности по числам, регистру и порядку слов
Отчасти язык может уйти от некоторых локальных двусмысленностей в том, что другие неоднозначности подавляются различными механизмами. В английском языке используются числа и порядок слов с остатками падежной системы в местоимениях: «Человек смотрел на людей, а они смотрели на него». В этой фразе совершенно ясно, кто и кому что делает. Точно так же в Perl есть числовые маркеры на существительных; то есть $ dog - это один пес, а @dog (потенциально) - много. Итак, $ и @ немного похожи на «это» и «эти» в английском языке . [курсив добавлен]
$this
является скалярным значением, он содержит 1 элемент, как яблоко
@that
является массивом значений, он содержит несколько таких значений, как ("яблоко", "апельсин", "груша")
%those
- хэш значений, он содержит ключевые пары значений, такие как ("яблоко" => "красный", "апельсин" = > "апельсин", "груша" = > "желтый")
См. perlintro для получения дополнительной сведения о типах переменных Perl.
Полезная мнемоника для сигилов Perl:
Matt Trout написал отличный комментарий на blog.fogus. me о сигилах Perl, который я считаю полезным, поэтому вставляю его ниже:
На самом деле, сигилы Perl не обозначают тип переменной - они обозначают сопряжение - $ это "the", @ это 'these', % - 'map of' или так далее - тип переменной обозначается через [] или {}. Вы можете увидеть это на примере:
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, вы узнаете, что вы собираетесь получить, а не то. а не то, чем вы оперируете, в основном.
Это, признаться, очень запутанно, пока вы не привыкнете к этому, но как только вы привыкнете к этому. это может быть чрезвычайно полезным инструментом для усвоения информации при просмотре кода.
Вы, конечно, имеете полное право ненавидеть это, но это интересная концепция, и я думаю, что вы предпочтете ненавидеть то. и я думаю, что вы предпочтете ненавидеть то, что происходит на самом деле, а не то, что вам показалось. происходит :)
Люди часто пытаются привязать сигилы к переменным типам, но они лишь слабо связаны. Это тема, которую мы очень сильно поразили в Изучение 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 %
теперь может обозначать ключ/значение slice или хэш или массив:
%array[ @indices ]; # returns pairs of indices and elements
%hash{ @keys }; # returns pairs of key-values for those keys