2012-05-01 31 views
8

Đây có thể là câu hỏi ngớ ngẩn ... Đoạn mã sau xuất ra nội dung của @arrayref@arraycont tương ứng. Lưu ý sự khác biệt giữa chúng và cách thức các giá trị của chúng được gán. Tôi biết những gì các mảng vô danh nào, nhưng ai có thể giải thích tại sao có một sự khác biệt?Perl: tham chiếu mảng so với mảng ẩn danh

Cảm ơn bạn rất nhiều.

@arrayref =(); 
@array = qw(1 2 3 4); 
$arrayref[0] = \@array; 
@array = qw(5 6 7 8); 
$arrayref[1] = \@array; 
print join "\t", @{$arrayref[0]}, "\n"; 
print join "\t", @{$arrayref[1]}, "\n"; 

@arraycont =(); 
@array = qw(1 2 3 4); 
$arraycont[0] = [@array]; 
@array = qw(5 6 7 8); 
$arraycont[1] = [@array]; 
print join "\t", @{$arraycont[0]}, "\n"; 
print join "\t", @{$arraycont[1]}, "\n"; 

đầu ra

5 6 7 8 
5 6 7 8 
1 2 3 4 
5 6 7 8 

Trả lời

11

này tạo ra một nông bản sao của mảng:

$arraycont[0] = [@array];

Trong khi điều này chỉ tạo ra một tham chiếu đến nó:

$arrayref[0] = \@array;

Kể từ sau đó bạn sửa đổi các mảng:

@array = qw(5 6 7 8);

arrayref vẫn trỏ tới vị trí cùng một mảng trong bộ nhớ, và vì thế khi dereferenced trong các báo cáo in nó in mảng hiện tại giá trị 5 6 7 8.

+1

A * cạn * sao chép, nếu '@array 'các tham chiếu có chứa sau đó' [@array] 'sẽ chứa các tham chiếu tương tự. Sự khác biệt sâu/nông không áp dụng trong trường hợp này, nhưng tôi nghĩ rằng nó là đáng nói đến anyway. –

+0

Cảm ơn, đã cập nhật. – yamen

3

Khối đầu tiên lưu địa chỉ của @array. Các tham chiếu giống như 'phát trực tuyến', bạn nhận trạng thái hiện tại. Vì vậy, nếu bạn tạo tham chiếu đến @array, như \ @array, khi bạn không tham chiếu đến nó, bạn sẽ luôn nhận được những gì @array điểm tại thời điểm không tham chiếu. Khi bạn bỏ tham khảo @array đã có (5 6 7 8)

Khi bạn làm [@array] của nó như ghi sống trực tuyến vào đĩa của bạn. Vì vậy, khi bạn (lại) phát nội dung đã ghi, bạn nhận được nội dung là được phát trực tuyến tại thời điểm ghi. Vì vậy, khi bạn giới thiệu $ arraycont [0] bạn có được những gì @array đã có tại thời điểm sao chép đó là
(1 2 3 4)

+0

cảm ơn! đây là một sự tương đồng sinh động. –

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