[Rio-pm] aprendendo ao corrigir provas

jimmy jimmy.tty em gmail.com
Qua Jun 28 11:40:57 PDT 2017


Saudações Nicole,

On Wed, Jun 28, 2017 at 11:33:46AM -0400, Gabriel Vieira wrote:
> 2017-06-28 11:07 GMT-04:00 Nicole Scherer <bionica2007-perl em yahoo.com>:
> 
>   Olá Monges!
>   Estou chocada!
>   Acabei de descobrir que alterar o valor de $item dentro de um loop  foreach
>   my $item (@vetor){ }  altera o valor do elemento do array!
>   Como é que eu nunca tinha percebido isto?
>   Quando leio os scripts dos alunos, sempre aprendo uma maneira inusitada de
>   resolver uma questão. Mas esta contradiz uma certeza que eu tinha...
>   #LETRA d) da Questão 01 - TROCAR T por U na
>   Sequencia
>   my @nucls = split(//, $dna);
> 
>   foreach my $item(@nucls) {
>       print "@nucls\n";
>       if($item eq "T") {
>           $item = "U";
>       }
>       if($item eq "t") {
>           $item = "u";
>       }
>   }
>   my $seq = uc(join("", @nucls));
>   E a sequencia realmente foi modificada!
>   Na minha concepção, a variável $item recebia o valor de cada elemento do
>   array, mas ocupava um endereço diferente.
O Gabriel Vieira já explicou e vou fazer apenas fazer algumas especulações:

1. Você está acostumada a usar:

   foreach my $item ( split //, $dna ) {...}

   Este caso não  se encaixa na explicação porque LIST,  neste caso, não
   possui "lvalues".

2. Você não costuma usar 'foreach my  $item' sobre um ARRAY e sim outras
formas de looping.

>   Mas assim, me parece que ela não passa de uma referência.
Não ficou claro (para mim), mas acho  que aqui, "referência" não é a que
o Perl entende por referência, correto? De qualquer forma... para ter
certeza, poderíamos utilizar o bultin "ref", por exemplo, e conferirmos
se a saída seria diferente de "empty string".

>   Está certo isto?
>   []s,
>   Nicole


Mais detalhes sobre a lista de discussão Rio-pm