Я пытаюсь дешифровать код 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
массив, но я не понимаю этот синтаксис: @{ ... }
?
Давайте рассмотрим это по частям.
$ s3
- ваш объект S3. $ s3-> buckets
вызывает метод buckets
для этого объекта, и мы сохраняем результаты в $ response
.Как говорится в документации, результаты представляют собой хеш-ссылку; ссылка - это скаляр, указывающий на другое значение. Если вы знакомы с указателями, идея та же.
Если бы у нас был простой хэш % ответа
, мы могли бы получить ключ buckets
в хэше, сказав $ response {buckets}
. Поскольку у нас есть ссылка на хэш , мы должны использовать оператор разыменования ( ->
), чтобы получить ключ, так что он становится $ response -> {buckets}
.
Но мы еще не закончили. $ response -> {buckets}
сам ссылка, в данном случае ссылка на массив. Здесь мы видим еще одну форму разыменования. Мы могли бы, если бы хотели получить только один элемент в указанном массиве, например, $ response -> {buckets} [0]
. Но нам нужен весь список, поэтому мы используем оператор @
для разыменования всего массива. Поскольку наша ссылка на массив содержится в сложной структуре, мы используем фигурные скобки, чтобы содержать выражение, на которое есть ссылка. Итак, @ {$ response -> {buckets}}
возвращает нам массив.
Это очень много всего в одном утверждении.
Для получения дополнительной информации о ссылках, которые могут быть одним из самых сложных предметов для изучения Perl, см. Следующее:
Тип переменной можно проверить с помощью функции ref().
@{ ... } означает «де-ссылка скалярная... как массив". Итак, если вы пойдете так: мой $aref=['a', 'b']; при доступе к @{$aref} будет выдаваться массив ('a', 'b').
Аналогично %{ ... } для хэш-ссылок.
Смотрите perlreftut для получения дополнительной информации.