Каково различие между '$this ', @that', и '%those' в Perl?

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

42
задан brian d foy 28 April 2010 в 19:48
поделиться

5 ответов

Вы можете посмотреть документы perlintro и perlsyn , чтобы действительно начать понимать Perl (например, прочтите "Руководство по переворачиванию"). : -)

При этом:

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

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

4
ответ дан 26 November 2019 в 23:41
поделиться

Изобретатель Перла был лингвистом и стремился сделать Perl похожим на «естественный язык».

Из этот пост :

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

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

8
ответ дан 26 November 2019 в 23:41
поделиться

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

@that является массивом значений, он содержит несколько таких значений, как ("яблоко", "апельсин", "груша")

%those - хэш значений, он содержит ключевые пары значений, такие как ("яблоко" => "красный", "апельсин" = > "апельсин", "груша" = > "желтый")

См. perlintro для получения дополнительной сведения о типах переменных Perl.

23
ответ дан 26 November 2019 в 23:41
поделиться

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

  • $calar
  • @rray
  • %ash

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

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

Вы, конечно, имеете полное право ненавидеть это, но это интересная концепция, и я думаю, что вы предпочтете ненавидеть то. и я думаю, что вы предпочтете ненавидеть то, что происходит на самом деле, а не то, что вам показалось. происходит :)

40
ответ дан 26 November 2019 в 23:41
поделиться

Люди часто пытаются привязать сигилы к переменным типам, но они лишь слабо связаны. Это тема, которую мы очень сильно поразили в Изучение 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
8
ответ дан 26 November 2019 в 23:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: