Pregunta

Me he encontrado con la siguiente línea de código. Tiene problemas:

  • tiene la intención de hacer lo mismo que empujar
  • debería haber usado push
  • es difícil de leer, entender
  • Desde entonces lo he cambiado para usar push
  • hace algo que pensé que era ilegal, pero claramente no lo es

aquí está:

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

Mi pregunta es: ¿qué significa pre-incrementar $ # array? Siempre consideré que $ # array es un atributo de una matriz y no se puede escribir.

¿Fue útil?

Solución

perldata dice:

" La longitud de una matriz es un valor escalar. Puede encontrar la duración del array @days evaluando $ # days, como en csh. Sin embargo, esta no es la longitud de la matriz; es el subíndice del último elemento, que es un valor diferente, ya que normalmente hay un elemento 0. Asignar a $ # days realmente cambia la longitud de la matriz. Acortar una matriz de esta manera destruye los valores intermedios. Al alargar una matriz que se acortó previamente, no se recuperan los valores que estaban en esos elementos. & Quot;

La modificación de $ # array es útil en algunos casos, pero en este caso, claramente empujar es mejor.

Otros consejos

Un incremento posterior devolverá la variable primero y luego la incrementará.

Si usó el post-incremento, estaría modificando el último elemento, ya que regresó primero, y luego empujando un elemento vacío hacia el final. En el segundo ciclo, estaría modificando ese valor vacío y presionando uno nuevo para más adelante. Por lo tanto, no funcionaría como un empujón en absoluto.

El pre-incremento incrementará la variable y luego la devolverá. De esa manera, su ejemplo siempre se escribirá en un nuevo y último elemento de la matriz y funcionará como push. Ejemplo a continuación:

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

salidas:

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

Asignar un valor mayor que la longitud de la matriz actual a $ # array extiende la matriz.

Este código también funciona:

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

La matriz de Perl es dinámica y crece cuando se asigna más allá de los límites.

En primer lugar, eso es sucio.

Dicho esto, también me sorprende que funcione. Habría adivinado que ++ $ # array habría obtenido el " No se puede modificar la constante " error que obtienes al intentar incrementar un número. (No es que lo haga accidentalmente, por supuesto). Pero, supongo que es exactamente donde nos equivocamos: $ # array no es una constante (un número); Es una expresión variable. Como tal, puedes meterte con eso. Considere lo siguiente:

my @array = qw/1 2 3/;

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

print "@array\n"

E incluso, para mayor diversión, esto:

my @array = qw/1 2 3/;

$#array += 5;

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

Y, sí, el Perl Cookbook se complace en meterse con $ # array para crecer o truncar matrices (Capítulo 4, receta 3). Todavía lo encuentro feo, pero tal vez sea solo un "" pero es un número" perjudicar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top