Conosco la subroutine in perl pass arg per riferimento. Ma nel codice sottostante, il ciclo foreach nella subroutine non dovrebbe modificare il valore per @list
perché lo my $i
dovrebbe creare una nuova variabile in modo lessicale var $i
. Qualsiasi assegnazione a $i
dovrebbe essere in ambito lessicale ma non modificare il valore @list
.perl ciclo foreach nella subroutine
Qualcuno può spiegare cosa sta succedendo all'interno del ciclo di foreach che causa il cambio di valore a @list
?
sub absList {
foreach my $i (@_) {
$i = abs($i);
}
}
@list = (-2,2,4,-4);
absList(@list);
print "@list";
Uscite:
2 2 4 4
Grazie per i collegamenti alle informazioni. Significa che '$ i' in foreach sarà sempre referenziato/con alias al @arr indipendentemente dal fatto che lo sto usando con/senza' my'. E se '@ arr' è la variabile speciale' @ _', significa che '$ i' sarà il valore reale degli elementi in' @ _'. Assegnare qualsiasi valore a '$ i' significa cambiare il valore degli elementi in' $ @ '. Ho ragione? – user2763829
@ user2763829 sì, 'mio' definisce solo l'ambito per la variabile di iterazione. –
Grazie. Anche senza 'my' in' foreach', '$ i' passerà sempre all'interno del ciclo' foreach' dato che '$ i' sarà scope localmente. Quindi c'è davvero bisogno di dichiarare il 'mio' per' $ i' (in questo scenario o in qualsiasi altro scenario)? – user2763829