Как я могу вставить элемент в ссылку на массив, хранящуюся в качестве хеш-значения? - PullRequest
10 голосов
/ 11 июля 2010
%data = (
    'digits' => [1, 2, 3],
    'letters' => ['a', 'b', 'c']
);

Как я могу push '4' в $data{'digits'}?

Я новичок в Perl. Эти символы $, @, % кажутся мне странными; Я пришел из PHP фона.

Ответы [ 4 ]

14 голосов
/ 11 июля 2010
push @{ $data{'digits'} }, 4;

$ data {'digits'} возвращает ссылку на массив. Поместите @ {} вокруг него, чтобы «разыменовать его». Таким же образом,% {} будет разыменовывать ссылку на хеш, а $ {} - скалярную ссылку.

Если вам нужно поместить что-то в хеш-ссылку, то есть

$hashref = { "foo" => "bar" }

Вы можете использовать либо:

${ $hashref }{ "foo2" } = "bar2"

или стрелка-обозначение:

$hashref->{"foo2"} = "bar2"

Определенным образом представьте, что ссылка - это то же самое, что и имя переменной:

push @{ $arrayref   }, 4
push @{ "arrayname" }, 4
push    @arrayname   , 4

На самом деле, это и есть "мягкие ссылки". Если у вас не включены все строгости, вы можете буквально:

# perl -de 0
  DB<1> @a=(1,2,3)
  DB<2> $name="a"
  DB<3> push @{$name}, 4
  DB<4> p @a
1234
2 голосов
/ 11 июля 2010

Для экзотического, но очень приятного на глаз варианта взгляните на autobox::Core CPAN модуль.

use autobox::Core;

my %data = (
    digits  => [1, 2, 3],
    letters => ['a', 'b', 'c'],
);

$data{digits}->push(4);

$data{digits}->say;   # => 1 2 3 4
2 голосов
/ 11 июля 2010
push @{data{'digits'}}, 4;

@ {} создает массив из ссылки (data{'digits'} возвращает ссылку на массив.) Затем мы используем полученный массив, чтобы поместить значение 4 в массив в хэше.

Эта ссылка помогает объяснить это немного.

Я использую эту ссылку для любых вопросов о хешах в Perl.

1 голос
/ 11 июля 2010
push @{ $data{digits} }, 4;

Официальный веб-сайт документации Perl содержит хорошее руководство по структурам данных: perldsc , в частности раздел Хэши массивов .

$@ и% известны как сигилы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...