Что означает то, когда метод Perl возвращает “hashref”?

Я пытаюсь дешифровать код Perl, который я не знаком с, так или иначе связанный с HashRef. Я использую Amazon:: S3, но мой вопрос является общим вопросом о Perl. См. код ниже:

use Amazon::S3;
my $s3 = Amazon::S3->new( ... );
my $response = $s3->buckets;

Документация (здесь) Саис, о s3-> блоки:

Returns undef on error, else HASHREF of results

Следующая строка работает на меня, но я не понимаю почему:

for $b in ( @ { $response->{buckets} } ) {
    print "bucket: " . $b->bucket . "\n";
}

Я Озадачен каждым оператором на первой строке.

Какой тип точно $response, $respone->{bucket}. Похож на выражение в for массив, но я не понимаю этот синтаксис: @{ ... }?

8
задан brian d foy 15 May 2010 в 23:22
поделиться

2 ответа

Давайте рассмотрим это по частям.

$ s3 - ваш объект S3. $ s3-> buckets вызывает метод buckets для этого объекта, и мы сохраняем результаты в $ response .Как говорится в документации, результаты представляют собой хеш-ссылку; ссылка - это скаляр, указывающий на другое значение. Если вы знакомы с указателями, идея та же.

Если бы у нас был простой хэш % ответа , мы могли бы получить ключ buckets в хэше, сказав $ response {buckets} . Поскольку у нас есть ссылка на хэш , мы должны использовать оператор разыменования ( -> ), чтобы получить ключ, так что он становится $ response -> {buckets} .

Но мы еще не закончили. $ response -> {buckets} сам ссылка, в данном случае ссылка на массив. Здесь мы видим еще одну форму разыменования. Мы могли бы, если бы хотели получить только один элемент в указанном массиве, например, $ response -> {buckets} [0] . Но нам нужен весь список, поэтому мы используем оператор @ для разыменования всего массива. Поскольку наша ссылка на массив содержится в сложной структуре, мы используем фигурные скобки, чтобы содержать выражение, на которое есть ссылка. Итак, @ {$ response -> {buckets}} возвращает нам массив.

Это очень много всего в одном утверждении.

Для получения дополнительной информации о ссылках, которые могут быть одним из самых сложных предметов для изучения Perl, см. Следующее:

  • perlreftut - Справочное руководство Perl
  • perldsc - Поваренная книга структур данных Perl
  • ] perllol - Все о массивах массивов
  • perlref - Основная справочная документация Perl
10
ответ дан 5 December 2019 в 12:56
поделиться

Тип переменной можно проверить с помощью функции ref().

@{ ... } означает «де-ссылка скалярная... как массив". Итак, если вы пойдете так: мой $aref=['a', 'b']; при доступе к @{$aref} будет выдаваться массив ('a', 'b').

Аналогично %{ ... } для хэш-ссылок.

Смотрите perlreftut для получения дополнительной информации.

-1
ответ дан 5 December 2019 в 12:56
поделиться
Другие вопросы по тегам:

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