2013-04-06 30 views
7

Trong Perl, bạn có thể gán cho một biến một tham chiếu đến một biến khác, như thế này:Shallow copy tham chiếu vào biến trong Perl

my @array = (1..10); 
my $ref = \@array; 

Và, vì nó là một tài liệu tham khảo, bạn có thể làm một cái gì đó như thế này và cả hai biến sẽ bị ảnh hưởng:

push @array, 11; 
push @$ref, 12; 

và cả hai biến sẽ chứa 1..12, vì cả hai đều trỏ đến cùng một không gian.

Bây giờ, tôi muốn biết liệu có cách nào bạn có thể làm điều tương tự không, nhưng bắt đầu với một ref và sau đó gán tham chiếu đó cho một biến đơn giản. Ví dụ:

my $ref = [1..12]; 
my @array = # something here that makes @array point to the same space $ref contains 

Tôi biết tôi chỉ có thể gán nó như thế này:

my @array = @$ref; 

nhưng, đó là một bản sao. Nếu tôi thay đổi $ ref hoặc @array, chúng sẽ là những thay đổi độc lập.

Có cách nào để làm cho @array trỏ đến cùng biến với $ ref không?

+1

Duplicate http://stackoverflow.com/questions/14070342/typeglob-aliases –

+0

Hãy lưu ý chú ý Ikegami về sự hợp lý nhất tiếp cận. Nếu bạn làm việc với các cấu trúc lồng nhau Perl, đủ, bạn sẽ quen với việc lấy nó như là một ref, thay vì sao chép nó vào một biến mảng. Nó chỉ thêm 1 ký tự để nhập vào '$'. – Axeman

+0

@ Axeman2: Vâng, tất nhiên rồi. Câu hỏi này là nhiều hơn về tinh thần giáo dục. :-) –

Trả lời

7

Bốn cách:

  • our @array; local *array = $ref;
  • \my @array = $ref; (Tính năng thử nghiệm thêm vào 5,22)
  • use Data::Alias; alias my @array = @$ref;
  • Sử dụng ma thuật (ví dụ tie my @array, 'Tie::StdArrayX', $ref;)

Nhưng tất nhiên, hợp lý cách tiếp cận là làm

my $array = $ref; 

và sử dụng @$array thay vì @array.



nói trên Tie :: StdArrayX:

package Tie::StdArrayX; 
use Tie::Array qw(); 
our @ISA = 'Tie::StdArray'; 
sub TIEARRAY { bless $_[1] || [], $_[0] } 
5

Điều này có thể được thực hiện khi mảng là biến gói, sử dụng typeglobs.

my $foo = [7,8,9]; 
our @bar; 
*bar = $foo; 
$foo->[1] = 3; 
print @bar;  # "739" 

biến từ vựng (ví dụ: my @bar) không thể được gán cho với typeglobs, mặc dù. Có thể có giải pháp hoặc giải pháp từ vựng được xây dựng xung quanh PadWalker.

+2

Dữ liệu :: Bí danh, không phải PadWalker. – ikegami

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