Почему Вы нуждаетесь в $ при доступе к массиву и хешируете элементы в Perl?

Я вижу, что для стрелки вы используете юникод символ длинную стрелку вправо . Само по себе оно не центрируется вертикально в текстовой строке. Конечно, вы можете попытаться обойти / обмануть это, регулируя отступы и т. Д., Но это не является устойчивым решением (так как дополнения могут нуждаться в настройке в соответствии с высотой элемента и размером шрифта). Вместо этого, почему бы не использовать реальный значок, например, long-arrow-right из font awesome :


Пример вашей формы с заменой только стрелки можно найти в этом коде [ 114]

11
задан David Schmitt 30 September 2008 в 17:52
поделиться

9 ответов

Части не недопустимы:

@slice = @myarray[1, 2, 5];
@slice = @myhash{qw/foo bar baz/};

И я подозреваю, что это - часть причины, почему необходимо указать, хотите ли Вы вытащить единственное значение из хеша/массива или нет.

17
ответ дан 3 December 2019 в 00:38
поделиться

Я только что использовал

my $x = myarray[1];

в программе и, к моему удивлению, вот то, что произошло, когда я выполнил ее:

$ perl foo.pl 
Flying Butt Monkeys!

Поэтому целая программа похожа на это:

$ cat foo.pl 
#!/usr/bin/env perl

use strict;
use warnings;

sub myarray {
  print "Flying Butt Monkeys!\n";
}

my $x = myarray[1];

Таким образом, myarray называет подпрограмму, передающую его ссылка на анонимный массив, содержащий единственный элемент, 1.

Это - другая причина, Вам нужен символ на доступе к массиву.

22
ответ дан 3 December 2019 в 00:38
поделиться

Это - допустимый Perl: @var[0]. Это - часть массива длины один. @var[0,1] была бы часть массива длины два.

@var['key'] не допустимый Perl, потому что массивы могут только быть индексированы числами и другими двумя (%var[0] and %var['key']) не допустимый Perl, потому что части хеша используют {} для индексации хеша.

@var{'key'} и @var{0} оба допустимые части хеша, все же. Очевидно, не нормально взять части длины один, но это, конечно, допустимо.

Посмотрите раздел части perldata perldocfor больше информации о разрезании в Perl.

9
ответ дан 3 December 2019 в 00:38
поделиться

Символ дает Вам тип возврата контейнера. Таким образом, если что-то запускается с @, Вы знаете, что это возвращает список. Если это запускается с $, это возвращает скаляр.

Теперь, если существует только идентификатор после символа (как $foo или @foo, затем это - доступ простой переменной. Если это сопровождается a [, это - доступ на массиве, если это сопровождается a {, это - доступ на хеше.

# variables
$foo
@foo

# accesses
$stuff{blubb} # accesses %stuff, returns a scalar
@stuff{@list} # accesses %stuff, returns an array
$stuff[blubb] # accesses @stuff, returns a scalar
              # (and calls the blubb() function)
@stuff[blubb] # accesses @stuff, returns an array

Некоторые естественные языки имеют очень похожие понятия.

Однако многие программисты нашли это сбивающим с толку, таким образом, Perl 6 использует инвариантный символ.

В целом компилятор Perl 5 хочет знать во время компиляции, если что-то находится в списке или в скалярном контексте, таким образом, без ведущего символа некоторые условия стали бы неоднозначными.

11
ответ дан 3 December 2019 в 00:38
поделиться

Люди уже указали, что у Вас могут быть части и контексты, но символы там для разделения вещей, которые являются переменными от всего остального. Вы не должны знать, что все ключевые слова или имена подпрограммы выбирают разумное имя переменной. Это - одна из больших вещей, которые я пропускаю о Perl на других языках.

9
ответ дан 3 December 2019 в 00:38
поделиться

Я могу думать об одном пути который

$x = myarray[1];

неоднозначно - что, если Вы хотели массив, названный m?

$x = m[1];

Как можно сказать, которые кроме regex соответствуют?

Другими словами, синтаксис там, чтобы помочь интерпретатору Perl, ну, в общем, интерпретировать!

7
ответ дан 3 December 2019 в 00:38
поделиться

Символ обеспечивает контекст для доступа:

  • $ контекст скаляра средств (скалярная переменная или единственный элемент хеша или массива)
  • @ средства перечисляют контекст (целый массив или часть хеша или массив)
  • % весь хеш
4
ответ дан 3 December 2019 в 00:38
поделиться

В Perl 5 Вам нужны символы ($ и), потому что интерпретация по умолчанию bareword идентификатора является интерпретацией вызова подпрограммы (таким образом избавляющий от необходимости использовать и в большинстве случаев).

4
ответ дан 3 December 2019 в 00:38
поделиться

В Perl 5 (чтобы быть измененным в Perl 6) символ указывает на контекст Вашего выражения.

  • Вы хотите конкретный скаляр из хеша, таким образом, это $hash{key}.
  • Вы хотите значение конкретного слота из массива, таким образом, это $array[0].

Однако, как указано zigdon, части законны. Они интерпретируют те выражения в контексте списка.

  • Вы хотите списки 1 значения в хеше @hash{key} работы
  • Но также и большие списки работают также, как @hash{qw<key1 key2 ... key_n>}.

  • Вы хотите несколько слотов из массива @array[0,3,5..7,$n..$n+5] работы

  • @array[0] список размера 1.

Нет никакого "контекста хеша", таким образом, ни один %hash{@keys} ни %hash{key} имеет значение.

Таким образом, Вы имеете "@" + "array[0]" <=> <символ = контекст> + <индексация выражения> как полное выражение.

6
ответ дан 3 December 2019 в 00:38
поделиться
Другие вопросы по тегам:

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