2010-05-25 46 views
7

Dựa trên sự hiểu biết hiện tại của tôi về băm trong Perl, tôi hy vọng mã này sẽ in "hello world". Thay vào đó nó không in được gì cả.Làm cách nào để tạo băm băm trong Perl?

%a=(); 

%b=(); 
$b{str} = "hello"; 
$a{1}=%b; 

$b=(); 
$b{str} = "world"; 
$a{2}=%b; 

print "$a{1}{str} $a{2}{str}"; 

Tôi giả định rằng một băm giống như một mảng, vậy tại sao tôi không thể tạo một băm khác?

+3

Ngắn và ngọt về lý do tại sao điều này không hiệu quả là vì, về cơ bản, một băm hoặc một mảng chỉ có thể chứa các giá trị vô hướng và băm không phải là vô hướng. Tuy nhiên, tài liệu tham khảo băm là. :) Các câu trả lời dưới đây có một số liên kết tốt về lý do tại sao điều này. –

Trả lời

6
  1. Bạn nên luôn sử dụng "sử dụng nghiêm ngặt;" trong chương trình của bạn.

  2. Sử dụng tham chiếu và băm vô danh.

use strict;use warnings; 
my %a; 

my %b; 
$b{str} = "hello"; 
$a{1}={%b}; 

%b=(); 
$b{str} = "world"; 
$a{2}={%b}; 

print "$a{1}{str} $a{2}{str}"; 

{%b} tạo ra tài liệu tham khảo để sao chép các hash %b. Bạn cần sao chép ở đây vì bạn làm trống sau.

+0

+1 để sử dụng lời khuyên nghiêm ngặt – Mike

+1

@Mike: Sử dụng độ chính xác phải là * tiêu chuẩn *, không phải trường hợp đặc biệt. – Ether

+0

@ether Tôi nhận ra rằng bây giờ, tôi đang học Perl và chỉ phát hiện ra * nghiêm ngặt * – Mike

6

Hashes of hash rất khó để có được quyền lần đầu tiên. Trong trường hợp này

$a{1} = { %b }; 
... 
$a{2} = { %b }; 

sẽ đưa bạn đến nơi bạn muốn.

Xem perldoc perllol để biết chi tiết đẫm máu về cấu trúc dữ liệu hai chiều trong Perl.

+1

'perldoc perllol' là tất cả các mảng, tất cả các thời gian, tôi nghĩ. 'perldoc perldsc' chuyển sang các kịch bản phức tạp hơn (và bao gồm băm). Tôi cũng khuyên bạn nên "perldoc perlreftut' cho bất kỳ ai mới tham chiếu trong Perl. – Telemachus

1

Perl thích làm phẳng cấu trúc dữ liệu của bạn. Đó thường là một điều tốt ... ví dụ: (@options, "another option", "yet another") kết thúc dưới dạng một danh sách.

Nếu bạn thực sự muốn có một cấu trúc bên trong cấu trúc khác, cấu trúc bên trong cần phải là một tham chiếu. Giống như vậy:

%a{1} = { %b }; 

Dấu ngoặc biểu thị băm, bạn đang điền giá trị từ% b và trở lại làm tham chiếu thay vì băm thẳng.

Bạn cũng có thể nói

$a{1} = \%b; 

nhưng mà làm thay đổi% b thay đổi $ a {1} là tốt.

2

Mike, Alexandr là câu trả lời đúng.

Đồng thời cũng là mẹo. Nếu bạn chỉ học băm perl có một mô-đun gọi là Data :: Dumper có thể in các cấu trúc dữ liệu của bạn một cách dễ dàng, điều này thực sự tiện dụng khi bạn muốn kiểm tra những giá trị mà cấu trúc dữ liệu của bạn có.

use Data::Dumper; 
print Dumper(\%a); 

khi bạn in này nó cho thấy

$VAR1 = { 
      '1' => { 
        'str' => 'hello' 
       }, 
      '2' => { 
        'str' => 'world' 
       } 
     }; 
4

Câu trả lời ngắn: Phím băm chỉ có thể được liên kết với một đại lượng vô hướng, không phải là một băm. Để làm những gì bạn muốn, bạn cần sử dụng tài liệu tham khảo.

Thay vì băm lại (heh) cách tạo cấu trúc dữ liệu đa cấp, tôi khuyên bạn nên đọc perlreftut. perlref hoàn chỉnh hơn, nhưng ban đầu nó hơi lấn át.

+1

perldsc (dữ liệu cấu trúc cookbook) là một nơi tốt để bắt đầu. –

+0

Cảm ơn! Tôi quên về perldsc. Tôi phải nhìn vào perlref để nhớ rằng perlreftut tồn tại. :-) Tôi nghĩ tôi nên làm quen với tài liệu. –

+0

@davidwall Việc xem xét các tài liệu luôn tốt, nhưng phần hướng dẫn cụ thể là dễ quên nhưng không thể bỏ qua. Tôi đặc biệt nhớ thích 'perlre', 'perlreftut',' perldsc', 'perlopentut',' perltoot' (có lẽ cái này đã cũ hoặc mất liên lạc với những thực hành tốt nhất hiện tại về OO trong Perl - không chắc chắn) và 'perlstyle '. – Telemachus

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