Pergunta

Eu me deparei com a seguinte linha de código. Ele tem problemas:

  • que se destina a fazer o mesmo que empurrar
  • que deveria ter impulso usado
  • é difícil de ler, compreender
  • Eu já mudou para usar impulso
  • ele faz algo que eu pensei era ilegal, mas é evidente que não é

aqui está:

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

A minha pergunta é: o que significa isso para pré-incremento $ # array? Eu sempre considerada $ # array para ser um atributo de uma matriz, e não gravável.

Foi útil?

Solução

perldata diz:

"O comprimento de uma matriz é um valor escalar Você pode encontrar o comprimento do @days matriz avaliando $ # dias, como em csh No entanto, este não é o comprimento da matriz;.. Que é o índice da último elemento, que é um valor diferente uma vez que existe normalmente um elemento 0. Atribuindo a $ # dias realmente muda o comprimento da matriz. Encurtar uma variedade desta forma destrói intervir valores. Alongamento uma matriz que foi previamente encurtado não recupera valores que eram naqueles elementos ".

Modificando $ # array é útil em alguns casos, mas, neste caso, claramente impulso é melhor.

Outras dicas

A pós-incremento voltará a variável primeiro e depois incrementá-lo.

Se você usou pós-incremento você estaria modifing o último elemento, desde a sua retornou primeiro, e depois empurrando um elemento vazio no final. No segundo ciclo você estaria modifing esse valor vazio e empurrando um novo vazio para mais tarde. Por isso não iria funcionar como um impulso em tudo.

O pré-incremento irá incrementar a variável e, em seguida, devolvê-lo. Dessa forma, o exemplo vai estar sempre escrevendo para uma nova último elemento da matriz e do trabalho como empurrar,. Exemplo abaixo:

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

saídas:

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

Atribuindo um valor maior do que o comprimento da matriz corrente para $#array estende a matriz.

Este código funciona também:

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

array Perl é dinâmico e cresce quando os limites para além Atribuir.

Em primeiro lugar, isso é falta.

Dito isso, eu também estou surpreso que ele funciona. Eu teria imaginado que ++$#array teria obtido o erro "Não é possível modificar constante" você começa quando tentando incrementar um número. (Não que eu alguma vez acidentalmente fazer isso, é claro.) Mas, eu acho que é exatamente onde estávamos errados: $#array não é uma constante (um número); é uma expressão variável. Como tal, você pode mexer com ele. Considere o seguinte:

my @array = qw/1 2 3/;

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

print "@array\n"

E até mesmo, para o divertimento extra, o seguinte:

my @array = qw/1 2 3/;

$#array += 5;

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

E, sim, o Perl Cookbook tem o prazer de mexer com $#array para crescer ou matrizes Truncar (Capítulo 4, receita 3). Ainda acho feio, mas talvez seja apenas um persistente "mas é um número" preconceito.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top