2016-02-10 3 views
0

Я создали следующий фрагмент:Perl ломтиков и ссылка

my %hash = (a => 1, b => 2, c => 3); 
my @backslashed_slice_result = \@hash{qw(a b c)}; 
# $backslashed... <-- originally I wrote this is a scalar, see below. 

я ожидал этого для получения ссылки на массив в массив, населенный срезе хэша, что эквивалентно:

my $arrayref_containing_slice = [ @hash{qw(a b c)} ]; # [1, 2, 3] 

Но на самом деле что-то еще:

my @mapped_list_of_values_to_refs = map { \$hash{$_} } qw(a b c); # (\1, \2, \3) 

Главное, что я могу найти в documentation, который описывает это поведение является утверждение:

Кусочек обращается к нескольким элементам списка, массив или хэш одновременно, используя список индексов.

Значит, \@hash{qw(a b c)} действительно есть фрагмент списка, а не хэш-фрагмент? Меня удивляет ссылка на значения хэша вместо результирующего массива значений. Что это за синтаксис, который заставляет perl применять ведущие \ к значениям хэша?

ответ

3

Две точки:

Во-первых, хэш-фрагмент не производит массив, он создает список нарезанных хэш-элементов.

Во-вторых, используя \ в списке, вы получите список ссылок на элементы первого списка.

+0

Мне не было известно о поведении в списке. Вот ссылка [documentation] (http://perldoc.perl.org/perlref.html#Making-References): _Примечание ссылки на перечислимый список - это не то же самое, что использовать квадратные скобки - вместо этого это одно и то же как создание списка ссылок! _ '@list = (\ $ a, \ @b, \% c); @list = \ ($ a, @b,% c); # То же самое! ' Синтаксис' \ @ 'выглядит точно так же, как обращение к массиву, поэтому объединение этого с хэш-срезами делает его довольно запутанным! –

+0

@AdamMillerchip Сигилы могут сбивать с толку. Возможно, этот бит из [perldata] (http://perldoc.perl.org/perldata.html#Slices) поможет: «Если вы смущены тем, почему вы используете« @ »на хэш-фрагменте вместо« % ', подумайте об этом так: тип скобки (квадратный или фигурный) определяет, есть ли в нем массив или хеш. С другой стороны, ведущий символ (' $ 'или' @ ') на массиве или хеш указывает, возвращаете ли вы сингулярное значение (скаляр) или множественное число (список) ». – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot Это объяснение ясное, и это то, что я имел в виду, но поведение ссылки в списке не согласуется с ним. Если мы также выведем, что предыдущая обратная косая черта означает «получить ссылку на», то «\ @ array» означает «ссылка на массив» и «\ @hashslice {...}» означает «ссылка на массив», за исключением того, что она «т. :-) –

Смежные вопросы