2013-04-06 11 views
7

W Perl, można przypisać do zmiennej odniesienie do innej zmiennej, tak:Płytki referencyjna kopia do zmiennej w Perlu

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

I, jak to jest odniesienie, można zrobić coś takiego i zostaną naruszone obie zmienne:

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

i obie zmienne będą zawierać 1..12, ponieważ zarówno punkt do tej samej przestrzeni.

Teraz chciałbym wiedzieć, czy istnieje sposób, aby zrobić to samo, ale zaczynając od ref i później przypisując to odniesienie do zwykłej zmiennej. Na przykład:

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

wiem, że mogę po prostu przypisać go tak:

my @array = @$ref; 

jednak, że jest to kopia. Jeśli zmienię $ ref lub @array, będą to niezależne zmiany.

Czy jest jakiś sposób, aby uczynić punkt @array tą samą zmienną co $ ref?

+1

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

+0

Należy wziąć pod uwagę noty Ikegami chodzi o najbardziej sensowne podejście. Jeśli pracujesz z zagnieżdżonymi strukturami Perla, wystarczy, że przyzwyczaisz się do odzyskania go jako ref, zamiast kopiowania go do zmiennej tablicowej. Dodaje tylko 1 znak do wpisania do '$'. – Axeman

+0

@ Axeman2: Tak, oczywiście. To pytanie dotyczyło raczej ducha edukacji. :-) –

Odpowiedz

7

cztery sposoby:

  • our @array; local *array = $ref;
  • \my @array = $ref; (Eksperymentalna funkcja dodana do 5,22)
  • use Data::Alias; alias my @array = @$ref;
  • Używanie magii (np tie my @array, 'Tie::StdArrayX', $ref;)

Ale oczywiście sensowne podejście to zrobić

my $array = $ref; 

i użyj @$array zamiast @array.



PowyŜsze Tie :: StdArrayX:

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

Można to zrobić, gdy tablica jest zmienną pakietu, używając typeglobów.

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

zmienne Lexical (tj my @bar) nie mogą być przypisane do Typeglob, choć. Być może istnieje rozwiązanie leksykalne lub obejście tego problemu, zbudowane wokół numeru PadWalker.

+2

Dane :: Alias, nie PadWalker. – ikegami

Powiązane problemy