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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top