Ho un codice che non funziona nel modo in cui mi aspetto e apprezzerei un po 'di aiuto per capire come farlo funzionare come mi aspetto.Modifica dell'array nella subroutine
Mi piacerebbe utilizzare una subroutine per modificare un array di input. Ho pensato che se avessi passato un riferimento all'array, le eventuali modifiche apportate si sarebbero riflesse anche nella versione del chiamante. Ma a quanto pare non funziona in questo modo.
my @test_array = qw (zero one two three);
shift_array(\@test_array);
print "POST SUBROUTINE: $test_array[0]\n";
sub shift_array {
my @array = @{(shift)};
shift @array;
print "AFTER SHIFT IN SUB: $array[0]\n";
}
Questo stampa:
AFTER SHIFT IN SUB: one POST SUBROUTINE: zero
mi aspettavo che la stampa one
entrambe le volte.
Quindi la mia domanda è duplice:
1) Perché non è vero comportando il modo in cui penso che dovrebbe? Passare un riferimento a un array crea una copia dell'array?
2) Come si ottiene il comportamento che mi aspettavo? Come faccio a ottenere una subroutine per far scorrere uno o più elementi dalla parte anteriore della copia di un array di input del chiamante?
Grazie in anticipo per qualsiasi suggerimento che possiate offrire.
Wow. Questa è una sfumatura che non ho capito. Grazie! – BlairHippo
@mob sei corretto. Modificare la mia risposta per chiarire – Cfreak
nota che con perl 5.14+ puoi scrivere 'shift $ array' nel sub e il de-referencing avviene automagicamente. – mirod