2013-04-06 8 views
7

In Perl, können Sie auf eine Variable, die einen Verweis auf eine andere Variable, wie folgt vergeben:Shallow Kopie Referenz in die Variable in Perl

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

Und, wie es eine Referenz ist, können Sie etwas tun und beide Variablen werden davon betroffen sein:

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

und beide Variablen 1..12, weil sie beide auf dem gleichen Raum enthalten.

Nun würde ich gerne wissen, ob es eine Möglichkeit gibt, das gleiche zu tun, aber mit einem Ref zu beginnen und diesen Verweis später einer einfachen Variablen zuzuordnen. Zum Beispiel:

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

Ich weiß, dass ich es so einfach zuordnen kann:

my @array = @$ref; 

aber, dass eine Kopie ist. Wenn ich $ ref oder @array ändere, sind das unabhängige Änderungen.

Gibt es eine Möglichkeit, @array auf dieselbe Variable wie $ ref zu zeigen?

+1

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

+0

Beachten Sie Ikegami Notiz über die vernünftigste Ansatz. Wenn Sie mit verschachtelten Perl-Strukturen arbeiten, werden Sie sich daran gewöhnen, sie als Referenz zu lesen, anstatt sie in eine Array-Variable zu kopieren. Es fügt nur 1 Zeichen hinzu, um '$' einzugeben. – Axeman

+0

@ Axeman2: Ja, natürlich. Diese Frage bezog sich mehr auf den Bildungsgeist. :-) –

Antwort

7

Vier Möglichkeiten:

  • our @array; local *array = $ref;
  • \my @array = $ref; (Experimental-Funktion hinzugefügt 5,22)
  • use Data::Alias; alias my @array = @$ref;
  • Magie (zB tie my @array, 'Tie::StdArrayX', $ref;)

Aber natürlich die fühlbare Ansatz ist zu tun

my $array = $ref; 

und verwenden Sie @$array anstelle von @array.



Vorstehende Tie :: StdArrayX:

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

Dies kann erfolgen, wenn das Array eine Paketvariable ist, die typeglobs verwendet. obwohl

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

Lexical Variablen (d.h. my @bar) nicht auf mit Typeglobs, zugeordnet werden. Vielleicht gibt es eine lexikalische Lösung oder Workaround um PadWalker gebaut.

+2

Daten :: Alias, nicht PadWalker. – ikegami