Frage

Ich habe über die folgende Codezeile kommen. Es hat Probleme:

  • es ist beabsichtigt, die gleiche wie Push-to-do
  • es sollte verwendet Push haben
  • es ist schwer zu lesen, verstehen
  • Ich habe da ändert es Push verwenden
  • es tut etwas, was ich dachte, war illegal, aber eindeutig nicht ist

hier ist sie:

$array [++$#array] = 'data';

Meine Frage ist: Was bedeutet es-Erhöhungs pre $ # Array? Ich hielt immer # Array $ ein Attribut eines Arrays zu sein, und nicht beschreibbar.

War es hilfreich?

Lösung

perldata sagt:

"Die Länge eines Arrays ist ein Skalarwert Sie können die Länge des Array @days finden von $ # Tage Auswertung, wie in csh Dies ist jedoch nicht die Länge des Arrays;.. Es ist der Index der letztes Element, das ein anderer Wert ist, da es normalerweise ein 0-te Element ist. Zuordnung zu # Tagen $ tatsächlich ändert die Länge des Arrays. ein Array Kürzen auf diese Weise Werte zerstört dazwischen. ein Array Verlängerung, die zuvor verkürzt wurde nicht erholt Werte, die in diesen Elementen waren. "

$ # Array Ändern ist in einigen Fällen nützlich, aber in diesem Fall deutlich drücken ist besser.

Andere Tipps

Ein Post-Inkrement wird die Variable zuerst zurückkehren und erhöhen Sie es dann.

Wenn Sie Nachinkrement verwendet würden Sie das letzte Element sein modifing, seit seinem ersten zurückgekehrt, und dann ein leeres Element auf das Ende schieben. Auf der zweiten Schleife würden Sie, dass die leeren Wert sein modifing und ein neues leeres für später schieben. So würde es gar nicht wie ein Push arbeiten.

Die Pre-Erhöhung wird die Variable erhöhen und die Rück es dann. Auf diese Weise Ihres Beispiel wird immer schriftlich sein auf ein neues, letztes Element des Arrays und arbeitet wie Push. Beispiel unten:

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";

Ausgänge:

pre keys: 3
pre: 2 3
post keys: 3
post: 1 2 3

Zuweisen größer ein Wert als die aktuelle Feldlänge erstreckt sich um das Array zu $#array.

Dieser Code funktioniert auch:

$ perl -le 'my @a; $a[@a]="Hello"; $a[@a]=" world!"; print @a'
Hello world!

Perl-Array ist dynamisch und wächst, wenn über die Grenzen hinaus zuweisen.

Zunächst einmal, das ist schlecht.

Das heißt, ich bin auch überrascht, dass es funktioniert. Ich hätte gedacht, dass ++$#array die „ändern kann nicht konstant“ bekommen hätte Fehler, den Sie erhalten, wenn eine Zahl zu erhöhen versuchen. (Nicht, dass ich jemals aus Versehen, dass, natürlich.) Aber ich denke, das ist genau das, wo wir falsch waren: $#array ist keine Konstante (eine Zahl); es ist ein variabler Ausdruck. Als solche können Sie verwirren mit ihm. Betrachten Sie das folgende:

my @array = qw/1 2 3/;

++$#array;
$array[$#array] = qw/4/;

print "@array\n"

Und auch, für mehr Spaß, diese:

my @array = qw/1 2 3/;

$#array += 5;

foreach my $wtf (@array) {
  if (defined $wtf) {
    print "$wtf\n";
  }
  else {
    print "undef\n";
  }
}

Und, ja, die Perl Kochbuch ist glücklich zu Chaos mit $#array zu wachsen oder Arrays gestutzt (Kapitel 4, Rezept 3). Ich finde es immer noch hässlich, aber vielleicht ist das nur ein Verweilen „aber es ist eine Zahl“ Vorurteil.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top