2013-04-06 10 views
7

In Perl, è possibile assegnare ad una variabile un riferimento a un'altra variabile, in questo modo:Shallow riferimento copia nella variabile in Perl

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

E, in quanto è un punto di riferimento, si può fare qualcosa di simile e entrambe le variabili saranno interessati:

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

e entrambe le variabili conterranno 1..12, perché entrambi puntano allo stesso spazio.

Ora vorrei sapere se esiste un modo per fare la stessa cosa, ma iniziare con un riferimento e successivamente assegnare tale riferimento a una variabile semplice. Per esempio:

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

So che posso solo assegnare in questo modo:

my @array = @$ref; 

ma, che è una copia. Se altero $ ref o @array, quelli saranno cambiamenti indipendenti.

C'è un modo per rendere @array punto alla stessa variabile di $ ref?

+1

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

+0

Prendere atto della nota di Ikegami la più sensata approccio. Se lavori con strutture Perl nidificate, abbastanza, ti abituerai a recuperarlo come un ref, invece di copiarlo su una variabile array. Aggiunge solo 1 carattere per digitare a '$'. – Axeman

+0

@ Axeman2: Sì, certo. Questa domanda era più sullo spirito educativo. :-) –

risposta

7

quattro modi:

  • our @array; local *array = $ref;
  • \my @array = $ref; (Funzione sperimentale aggiunti 5,22)
  • use Data::Alias; alias my @array = @$ref;
  • Usando la magia (ad es tie my @array, 'Tie::StdArrayX', $ref;)

Ma, naturalmente, il sensibile approccio è quello di fare

my $array = $ref; 

e utilizzare @$array anziché @array.



Aforementioned Tie :: StdArrayX:

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

Questo può essere fatto quando la matrice è una variabile di pacchetto, utilizzando typeglobs.

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

variabili lessicali (cioè my @bar) non possono essere assegnati a con typeglob, però. Forse c'è una soluzione lessicale o una soluzione alternativa costruita intorno a PadWalker.

+2

Dati :: Alias, non PadWalker. – ikegami