2010-05-15 37 views
8

Tôi đang cố gắng giải mã mã Perl mà tôi không quen thuộc, bằng cách nào đó liên quan đến HashRef. Tôi đang sử dụng Amazon :: S3, nhưng câu hỏi của tôi là một câu hỏi chung của Perl. Xem mã bên dưới:Khi phương thức Perl trả về "hashref" nghĩa là gì?

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

Tài liệu (ở đây) sais, khoảng P3-> xô:

Returns undef on error, else HASHREF of results 

Các dòng sau đang làm việc cho tôi, nhưng tôi không hiểu tại sao:

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

Tôi đang bối rối bởi mỗi toán tử trên dòng đầu tiên.

Loại chính xác là $response, $respone->{bucket}. Có vẻ như biểu thức bên trong for là một mảng, nhưng tôi không hiểu cú pháp này: @{ ... }?

Trả lời

10

Hãy xem xét từng phần một.

$s3 là đối tượng S3 của bạn. $s3->buckets gọi phương thức buckets trên đối tượng đó và chúng tôi lưu trữ kết quả theo số $response. Như các tài liệu nói, kết quả là một tham chiếu băm; một tham chiếu là một vô hướng trỏ đến một giá trị khác. Nếu bạn quen thuộc với con trỏ, ý tưởng là như nhau.

Nếu chúng tôi có hàm băm đơn giản %response, chúng tôi có thể nhận được khóa buckets trong mã băm bằng cách nói $response{buckets}. Vì chúng tôi có một tham chiếu băm , chúng tôi phải sử dụng toán tử dereference (->) để lấy khóa, để trở thành $response->{buckets}.

Nhưng chúng tôi chưa hoàn thành. $response->{buckets}chính nó một tham chiếu, trong trường hợp này là tham chiếu mảng. Ở đây chúng ta thấy một hình thức dereferencing. Chúng tôi có thể, nếu chúng tôi muốn chỉ nhận được một mục trong mảng được tham chiếu, ví dụ: $response->{buckets}[0].Nhưng chúng tôi muốn toàn bộ danh sách, vì vậy chúng tôi sử dụng toán tử @ để dereference toàn bộ mảng. Vì tham chiếu mảng của chúng ta được chứa trong một cấu trúc phức tạp, chúng ta sử dụng các curlies để chứa biểu thức có tham chiếu. Vì vậy, @{ $response->{buckets} } sẽ cho chúng tôi mảng.

Đó là thực hiện rất nhiều trong một câu lệnh.

Để biết thêm về tài liệu tham khảo, có thể là một trong những đối tượng khó khăn nhất để tìm hiểu trong Perl, thấy như sau:

  • perlreftut - Perl tham khảo hướng dẫn
  • perldsc - Perl cấu trúc dữ liệu Cookbook
  • perllol - Tất cả về mảng mảng
  • perlref - Tài liệu tham chiếu chính Perl
+0

Rất cám ơn. Rất hữu dụng. – Uri

+0

perlreftut perlreftut perlreftut :) – hobbs

-1

Bạn có thể kiểm tra loại biến với hàm ref().

@ {...} có nghĩa là "vô hướng tham chiếu ... dưới dạng mảng". Vì vậy, nếu bạn đi như thế này: my $ aref = ['a', 'b']; truy cập @ {$ aref} sẽ sinh ra mảng ('a', 'b').

Tương tự% {...} cho tham chiếu băm.

Xem perlreftut để biết thêm thông tin.

4

Chào mừng bạn đến với thế giới của tài liệu tham khảo Perl! Bạn sẽ tìm thấy reference tutorial rất tiện dụng.

Cú pháp @{...} lấy giá trị vô hướng và cố gắng không tham chiếu nó vào một mảng. Ngoài ra còn có %{...}, cố gắng không tham chiếu đến một băm. Các curlies là tùy chọn, vì vậy bạn cũng có thể viết @$reference hoặc %$reference để có được hiệu ứng tương tự. Một số người thấy chúng hữu ích khi tham chiếu bên trong một băm hoặc một mảng, như trường hợp ở đây.

Để giúp bạn hiểu cấu trúc dữ liệu nhiều hơn một chút, hãy thử sử dụng một cái gì đó như Dữ liệu :: Dumper.

use Data::Dumper; 
print Dumper $response; 
print Dumper $response->{buckets}; 
# The docs say that buckets is a hashref. It also happens that 
# you can coerce a hash into an array. Let's treat it as a hash 
# and see what's inside it, manually. The Dumper call above should 
# have already provided the structure to you, though. 
foreach my $k (keys %{$response->{buckets}}) { 
    print "$k => " . Dumper $response->{buckets}->{$k} 
} 
Các vấn đề liên quan