Cosa significa pre-incrementare l'array $ #?
Domanda
Ho trovato la seguente riga di codice. Ha problemi:
- è destinato a fare lo stesso di push
- avrebbe dovuto usare push
- è difficile da leggere, capire
- Da allora l'ho cambiato per usare push
- fa qualcosa che pensavo fosse illegale, ma chiaramente non lo è
eccolo:
$array [++$#array] = 'data';
La mia domanda è: cosa significa pre-incrementare $ # array? Ho sempre considerato $ # array come un attributo di un array e non scrivibile.
Soluzione
perldata dice:
" La lunghezza di un array è un valore scalare. Puoi trovare la lunghezza dell'array @days valutando $ # giorni, come in csh. Tuttavia, questa non è la lunghezza dell'array; è il pedice dell'ultimo elemento, che ha un valore diverso poiché di solito esiste un 0 ° elemento. L'assegnazione a $ # giorni modifica effettivamente la lunghezza dell'array. Accorciare un array in questo modo distrugge i valori intermedi. L'allungamento di un array precedentemente abbreviato non ripristina i valori presenti in quegli elementi. & Quot;
La modifica dell'array $ # è utile in alcuni casi, ma in questo caso spingere chiaramente è meglio.
Altri suggerimenti
Un post-incremento restituirà prima la variabile e poi la incrementerà.
Se hai usato il post-incremento, modificheresti l'ultimo elemento, dal momento che è stato restituito per primo, quindi spingi un elemento vuoto alla fine. Nel secondo ciclo modificheresti quel valore vuoto e ne spingerai uno nuovo per dopo. Quindi non funzionerebbe affatto come una spinta.
Il pre-incremento incrementa la variabile e quindi la restituisce. In questo modo il tuo esempio scriverà sempre su un nuovo, ultimo elemento dell'array e funzionerà come push. Esempio seguente:
my (@pre, @post);
$pre[$#pre++] = '1';
$pre[$#pre++] = '2';
$pre[$#pre++] = '3';
$post[++$#post] = '1';
$post[++$#post] = '2';
$post[++$#post] = '3';
print "pre keys: ".@pre."\n";
print "pre: @pre\n";
print "post keys: ".@post."\n";
print "post: @post\n";
output:
pre keys: 3
pre: 2 3
post keys: 3
post: 1 2 3
L'assegnazione di un valore maggiore della lunghezza della matrice corrente a $ # array
estende la matrice.
Anche questo codice funziona:
$ perl -le 'my @a; $a[@a]="Hello"; $a[@a]=" world!"; print @a'
Hello world!
L'array Perl è dinamico e cresce quando viene assegnato oltre i limiti.
Prima di tutto, è un fallo.
Detto questo, sono anche sorpreso che funzioni. Avrei indovinato che ++ $ # array
avrebbe ottenuto " Impossibile modificare la costante " errore visualizzato quando si tenta di incrementare un numero. (Non che io l'abbia mai fatto per caso, ovviamente.) Ma, immagino che sia esattamente dove ci sbagliavamo: $ # array
non è una costante (un numero); è un'espressione variabile. Come tale puoi pasticciare con esso. Considera quanto segue:
my @array = qw/1 2 3/;
++$#array;
$array[$#array] = qw/4/;
print "@array\n"
E anche, per divertimento extra, questo:
my @array = qw/1 2 3/;
$#array += 5;
foreach my $wtf (@array) {
if (defined $wtf) {
print "$wtf\n";
}
else {
print "undef\n";
}
}
E, sì, il libro di ricette Perl è felice di rovinare $ # array
per far crescere o troncare le matrici (capitolo 4, ricetta 3). Lo trovo ancora brutto, ma forse è solo un persistente "ma è un numero" pregiudizi.