2009-11-24 31 views
5
# I have a hash 
    my %my_hash; 

# I have an array 
    @my_array = ["aa" , "bbb"]; 

# I store the array in my hash 
    $my_hash{"Kunjan"} = @my_array; 

# But I can't print my array's element 
    print $my_hash{"Kunjan"}[0]; 

Tôi mới sử dụng Perl. Làm ơn giúp tôi.Làm cách nào để truy cập phần tử của mảng được lưu trong băm của tôi trong Perl?

+5

Chưa có ai đề cập đến nó, nhưng hãy xem Cookbook Data Structures. Nó có nhiều ví dụ để tạo và truy cập dữ liệu trong các cấu trúc lồng nhau khác nhau. Bạn có thể đọc nó trên máy của bạn bằng cách sử dụng lệnh 'perldoc perldsc' và bạn cũng có thể tìm thấy nó tại http://perldoc.perl.org/perldsc.html – daotoad

+1

Ngoài ra, hãy xem http://perlmonks.org/?node= references + quick + reference – ysth

Trả lời

3

Bạn có một vài sai sót trong chương trình của bạn:

my @my_array = ("aa" , "bbb"); 
$my_hash{"Kunjan"} = \@my_array; 
print $my_hash{"Kunjan"}[0]; 

tôi đã thực hiện ba thay đổi:

  1. Added my trước @my_array trên dòng đầu tiên
  2. Thay đổi [...] để (...) trên dòng đầu tiên
  3. Thêm \ trước @my_array o n dòng thứ hai
+0

Cũng có thể thêm rằng dấu gạch chéo ngược chuyển đổi mảng thành tham chiếu. Đọc về các tham chiếu tại đây: http://perldoc.perl.org/perlref.html –

14

Cú pháp mảng của bạn không chính xác. Bạn đang tạo tham chiếu danh sách ẩn danh và @my_array là danh sách phần tử đơn chứa tham chiếu đó.

Bạn có thể làm việc với các tài liệu tham khảo đúng cách, như một vô hướng:

$my_array = ["aa" , "bbb"]; 
$my_hash{"Kunjan"} = $my_array; 

Hoặc bạn có thể làm việc với các danh sách như một danh sách, tạo ra các tài liệu tham khảo khi đưa nó vào băm:

@my_array = ("aa" , "bbb"); 
$my_hash{"Kunjan"} = \@my_array; 
0

Hãy thử những sửa đổi:

my %my_hash; 

# ["aa" , "bbb"] produces an array reference. Use() instead 
my @my_array = ("aa" , "bbb"); 

# 'Kunjan' hash is given reference to @my_array 
$my_hash{ Kunjan } = \@my_array; 

# bareword for hash key is nicer on the eye IMHO 
print $my_hash{ Kunjan }[0]; 


Tuy nhiên vẫn còn là một điều bạn cần phải xem xét nếu bạn sử dụng phương pháp này:

unshift @my_array, 'AA'; 
print $my_hash{ Kunjan }[0]; # => AA - probably not what u wanted! 


Vì vậy, những gì bạn có lẽ sau là:

$my_hash{ Kunjan } = ["aa" , "bbb"]; 

Sau đó băm không còn tham khảo @my_array .

/I3az/

10

Nếu bạn đã chỉ đặt này ở phía trên cùng của kịch bản của bạn:

use strict; 
use warnings; 

... bạn đã có thể nhận một số thông báo lỗi chỉ ra những gì đã sai:

Global symbol "@my_array" requires explicit package name at kunjan-array.pl line 8. 
Global symbol "@my_array" requires explicit package name at kunjan-array.pl line 11. 

Vì vậy, hãy khai báo mảng trước tiên với my @my_array; và sau đó bạn sẽ nhận được:

Can't use string ("1") as an ARRAY ref while "strict refs" in use at kunjan-array.pl line 14. 
  • Bạn tạo một arrayref và cố gắng gán nó vào một mảng - xem perldoc perldata cho cách khai báo một mảng
  • Bạn đã cố gán một mảng để một hash (bạn chỉ có thể gán vô hướng, chẳng hạn như một arrayref - xem perldoc perlref để biết thêm thông tin về tài liệu tham khảo)
  • Bạn cần phải cân nhắc yếu tố băm để lấy phần tử mảng, ví dụ:$my_hash{"Kunjan"}->[0] - một lần nữa nhìn thấy perldoc perlref cho làm thế nào để dereference một hashref
+0

Không cần mũi tên: '$ my_hash {Kunjan} [0]' sẽ hoạt động. – friedo

+0

@friedo: huh, tôi không nghĩ rằng đường '-> 'đã hoạt động trước' -> 'đầu tiên. khéo léo. – Ether

0

khác đã giải thích độc đáo gì là những gì, nhưng tôi muốn nói thêm, rằng (đặc biệt nếu bạn là người mới đến Perl), nó sẽ là tuyệt vời nếu bạn bỏ ra một thời gian và đọc các tài liệu perldscperllol.

Các vấn đề liên quan