[bcn-pm] Dubte while (eval)

Joaquín Ferrero explorer a joaquinferrero.com
dij jul 30 00:48:38 PDT 2015


El 30/07/15 a las 09:12, Toni Homedes i Saun escribió:
> Hola JJ,
>
> Para estar seguro lo he vuelto a probar así:
>
> perl -e '$hr = {'A' => 1, 'B' => 2}; print "$a => $b\n" while (($a, $b) = each $hr)' | head
>
> y va bien, con lo que confirma que `each` acepta referencias a hash. Lo que da la sensación es de que falle cuando en lugar de una variable uses un literal: `each {A => ...`
>
> Si no fuera porque no se lo bastante de Perl, parece que fuese un bug de Perl en que
>
>     $hr = {..}; while (each $hr)
>
> va bien y
>
>     while (each {...})
>
> va mal.
>
> Toni

El poder usar referencias -no bendecidas- a hash o array en each() (y otras funciones), es a partir de Perl v5.14.

Es interesante lo que indicas, Toni. Si repetimos el experimento con arrays, falla de la misma manera:

$ perl -E 'use experimental "autoderef"; say "$a => $b" while ($a, $b) = each [ 2, 4, 6 ];' |head
0 => 2
0 => 2
0 => 2
0 => 2
0 => 2
0 => 2
0 => 2
0 => 2
0 => 2
0 => 2
(bucle infinito)

Esto huele a bug... Falla incluso en la última versión estable, en la v5.22. Lo he probado también en v5.10, v5.18... y también fallan.

Según la documentación, en *perldoc -f each*,

«Después de que "each" devuelva todas las entradas del hash o del array, la siguiente llamada a "each" devuelve la lista vacía en contexto de lista, y "undef" en contexto escalar; la _siguiente llamada a __esta_, reinicia la iteración».

El problema podría venir de ahí.

>
> El 30/07/15 a les 08:05, JJ Merelo ha escrit:
>>
>>
>> 2015-07-29 14:58 GMT+02:00 Toni Homedes i Saun <toni en homedes.net
>> <mailto:toni en homedes.net>>:
>>
>>     Hola Mongers,
>>
>>     Fent un molinet amb Perl m'he trobat el següent:
>>
>>
>>     Bé:
>>     ---
>>
>>     perl -e '%h = ('A' => 1, 'B' => 2); print "$a => $b\n" while (($a,
>>     $b) = each \%h)' | head
>>
>>     Malament:
>>     ---------
>>
>>     perl -e 'print "$a => $b\n" while (($a, $b) = each {'A' => 1, 'B' =>
>>     2})' | head
>>
>>
>>
>>     Perquè? Una referència a un hash no és sempre una referència a un hash?
>>
>>
>> Asi a bote pronto, en el de arriba estás cerrando las comillas simples
>> antes de la primera A. En el segundo, hum, también. Pero no creo que sea
>> eso: en el segundo estás usando una referencia a hash {}; en el primero
>> un hash ()
>>
>> Saludos
>>
>> JJ
>>
>>
>>
>> _______________________________________________
>> llista dels Barcelona-pm
>> Barcelona-pm en pm.org
>> http://mail.pm.org/mailman/listinfo/barcelona-pm
>> BCN Perl Mongers: http://barcelona.pm.org
>>
> _______________________________________________
> llista dels Barcelona-pm
> Barcelona-pm en pm.org
> http://mail.pm.org/mailman/listinfo/barcelona-pm
> BCN Perl Mongers: http://barcelona.pm.org

------------ pr�a parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.pm.org/pipermail/barcelona-pm/attachments/20150730/b9515deb/attachment.html>


Més informació sobre la llista de correu Barcelona-pm