Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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.