[PortoAlegre-pm] Quiz

Adriano Ferreira a.r.ferreira em gmail.com
Segunda Fevereiro 5 08:27:16 PST 2007


On 2/5/07, Igor Sutton <igor.sutton em gmail.com> wrote:
> Assumindo que ref($data) devolve 'ARRAY', o que acontece quando
> utilizamos o seguinte código?
>
> foreach($data) {
>     print;
> }

Só completando a resposta do Igor, o foreach sobre uma variável
escalar é um laço que executa uma vez só e faz um alias da variável do
loop. Isto pode ser útil às vezes:

foreach ($data->{struct1}->{struct2}->[2]->{struct3}) {
     $a = $_ * (1 - $_)/(1 + $_)
}

ao invés de

$a = $data->{struct1}->{struct2}->[2]->{struct3} *
         (1 - $data->{struct1}->{struct2}->[2]->{struct3})/
         (1 + $data->{struct1}->{struct2}->[2]->{struct3})

(É óbvio que

$v = $data->{struct1}->{struct2}->[2]->{struct3};
$a = $v * (1 - $v)/(1 + $v)

funciona também mas não é tão sexy. No entanto é diferente porque a
atribuição $v = faz cópia de números e strings.)

No caso em que ref($data) eq 'ARRAY', a resposta é que a representação
string do array vai ser impressa, algo como

$ perl -e '$a = []; foreach ($a) { print }'
ARRAY(0x10240170)

############

Como um comentário, para um laço tão pequeno, um modificador pode ser
usado também passando

> foreach($data) {
>     print;
> }

para

   print foreach ($data); # ou
   print foreach (@$data); # se era esta a idéia

Adriano.


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