[bcn-pm] Primer pas...

Xavier Noria fxn at hashref.com
Fri Dec 12 11:42:58 CST 2003


El 12/12/2003, a las 17:45, Francesc Guasch escribió:

> Pots passar com a paràmetre una referència a una funció.
> Si vols, pots ser anonima:
>
> sub dobla { # funció que dobla un nº
>         return 2*shift;
> }
>
> sub bar { # funció que crida a una funció que ens passen com paràmetre
>         my ($func,$var) = @_;
>         return &$func($var);
> }
>
> print bar(\&dobla,3),"\n"; # referència a una funció
>
> print bar( sub { return 3*shift } , 3) ,"\n"; # ref. a una funció
>                                                           anònima

A mes a mes, si vols imitar la sintaxi de map, es a dir, map BLOCK 
LIST, pots aconseguir-ho usant prototipus. Es tracta de declarar que el 
primer parametre es una referencia a una subrutina, i fer anar que Perl 
et perdona el "sub" del constructor de coderefs sub { ... }.

Els prototipus a Perl no son el mateix que els prototipus en un 
llenguatge estaticament tipat, estan documentats a la seccio 
"Prototypes" de perlsub. Es un dels trucs que es poden emprar per a fer 
com si extenguessis el llenguatge. Per exemple definint les dues 
subrutines

     sub try (&@) {
         my ($try,$catch) = @_;
         eval { &$try };
         if ($@) {
             local $_ = $@;
             &$catch;
         }
     }

     sub catch (&) { $_[0] }

pots emprar aquesta sintaxi (i.e., el seguent codi compila):

     try {
         die "phooey";
     } catch {
         /phooey/ and print "unphooey\n";
     };

El modul Error.pm esta implementat aixi.

Aquest article situa les diferencies entre el concepte mes estandard de 
prototipus i el de Perl:

     Far More Than Everything You've Ever Wanted to Know about
     Prototypes in Perl
     http://www.perl.com/language/misc/fmproto.html

-- fxn




More information about the Barcelona-pm mailing list