Aprendiendo Perl, el reto: Encontrar duplicados

Javier Tiá javier.tia en gmail.com
Jue Abr 5 21:34:16 PDT 2012


2012/4/5 Marcelo E. Magallon <marcelo.magallon en gmail.com>:
>  Curiosamente en Learning Perl el primer ejemplo de open es con
>  barewords y solo dos argumentos, y luego de eso pasan muchas
>  páginas antes de siquiera mencionar open con referencias.  Esto
>  de hecho ha sido motivo de discusión aquí y allá y brian d foy
>  dice que primero que nada, uno no puede ignorar el hecho que
>  open con barewords existe, y que si la gente quiere aprender
>  Perl tiene que saber que eso existe, aún cuando ellos mismos
>  nunca vayan a escribir ni una sola vez open de esa forma.

En la edición 4th de Learning Perl, es la que tengo, todos los
ejemplos vistos usan barewords. Uso mayormente Perl v5.8.

>> Esta parte me resulta confusa.
>> Puedo usar "get_hash('el cielo pintado de azul')" o
>> "get_hash($foo)" que esperaría el mismo resultado, pero si uso
>> "get_hash" o "get_hash()" me da error.
>
>  Mea culpa, no me expliqué bien.  El problema al que yo me
>  pretendía referir no está en la llamada a get_hash, está en la
>  implementación:
>
>    sub get_hash($)
>    {
>       open(FILE, $_);
>       return Digest::MD5->new->addfile(*FILE)->hexdigest;
>    }
>
>  ese "$_" en open se refiere a la variable $_ en el sitio de la
>  llamada:
>
>    $hashes{$File::Find::name} = get_hash($_) if -f $_;
>
>  y lo que quise decir es que el argumento de get_hash es
>  completamente ignorado.  En get_hash el primer argumento de la
>  función sería $_[0], y la expresión más idiomática es:
>
>    my $filename = shift;
>    open(FILE, $filename);
>    return Digest::MD5->new->addfile(*FILE)->hexdigest;
>
>  La razón por la que te da error al tratar de usar get_hash o
>  get_hash() es porque el prototipo dice que esa función debe ser
>  llamada con un argumento escalar.

Escribiéndole así:

sub get_hash
{
      my $filename = shift;
      open(FILE, $filename);
      return Digest::MD5->new->addfile(*FILE)->hexdigest;
}

Se vería mejor y sería otra razón para no usar prototipo :)

Corríjeme Marcelo si estoy equivocado, pero me parece estar viendo
como buena práctica: NO usar prototipos.

Saludos,

Javier


Más información sobre la lista de distribución Costarica-pm