В чем разница между $this
, @that
и %those
в Perl?
В чем разница между `$ this`,` @that` и `% the` в Perl?
Ответ 1
Полезная мнемоника для синглов Perl:
- $Calar
- @rray
- % золы
Matt Trout написал замечательный комментарий к blog.fogus.me о Perl sigils, который, как мне кажется, полезен, поэтому наклейте ниже:
Собственно, perl sigils не обозначают тип переменной - они обозначают сопряжение - $is 'the, @is 'Эти,% is' map of or so - тип переменной обозначаются через [] или {}. Вы можете увидеть это с помощью
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'};
так глядя на сигилу, когда sklim-код skimming скажет вам, что вы собираетесь - скорее чем вы работаете, в значительной степени.
Это, по общему признанию, действительно запутывает, пока вы не привыкнете к нему, но как только вы привыкли к этому это может быть чрезвычайно полезным инструментом для поглощения информации, в то время как код проскальзывания.
Конечно, вы все еще имеете право ненавидеть его, но его интересная концепция и я что вы, возможно, предпочтете ненавидеть, что-то происходит, а не то, что вы считали происходит:)
Ответ 2
$this
- это скалярное значение, оно содержит 1 элемент, например apple
@that
- это массив значений, он содержит несколько таких, как ("apple", "orange", "pear")
%those
- хэш значений, он содержит пары ключевых значений, такие как ("apple" => "red", "orange" => "orange", "pear" => "yellow")
Подробнее о переменных переменных Perl см. perlintro.
Ответ 3
Изобретатель Perl был лингвистом, и он стремился сделать Perl "естественным языком".
От этот пост:
Несознание по номеру, случаю и порядку слов
Отчасти причина, по которой язык может уйти от некоторых локальных двусмысленностей, заключается в том, что другие двусмысленности подавляются различными механизмами. Английский использует число и порядок слов, с остатками системы case в местоимениях: "Человек посмотрел на мужчин, и они оглянулись на него". В этом предложении совершенно ясно, кто что делает, кому. Точно так же Perl имеет числовые маркеры в своих существительных; то есть $dog - это один pooch, а @dog (потенциально) много. Итак, $и @немного похожи на "this" и "these" на английском языке. [выделено мной]
Ответ 4
Люди часто пытаются привязать сигилы к переменным типам, но они только слабо связаны. Это тема, которую мы очень сильно ударили в Learning 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]; # возвращает пары индексов и элементов % hash {@keys}; # возвращает пары ключей-значений для этих ключей
Ответ 5
Возможно, вы захотите посмотреть perlintro
и perlsyn
, чтобы действительно начать работу с пониманием Perl (т.е. прочитайте руководство по переворачиванию).: -)
Это сказало:
-
$this
- это скаляр, который может хранить число (int или float), строку или ссылку (см. ниже); -
@that
- это массив, который может хранить упорядоченный список скаляров (см. выше). Вы можете добавить скаляр в массив с помощью функцийpush
илиunshift
(см.perlfunc
), и вы можете использовать список скалярных литералов или переменных, разделенных запятыми, для создания литерала массива (т.е.my @array = ($a, $b, 6, "seven");
) -
%those
- хэш, который является ассоциативным массивом. У хэшей есть пары записей с ключом, так что вы можете получить доступ к значению хэша, предоставив его ключ. Хэш-литералы также могут быть указаны так же, как списки, за исключением того, что каждая нечетная запись является ключом, а каждый четный - значением. Вы также можете использовать символ=>
вместо запятой, чтобы отделить ключ и значение. (т.е.my %ordinals = ("one" => "first", "two" => "second");
)
Обычно, когда вы передаете массивы или хеши для вызовов подпрограмм, отдельные списки выравниваются в один длинный список. Иногда это желательно, иногда нет. В последнем случае вы можете использовать ссылки для передачи ссылки на весь список как один скалярный аргумент. Синтаксис и семантика ссылок сложны, и они выходят за рамки этого ответа. Если вы хотите проверить это, посмотрите perlref
.