[bcn-pm] regexp dinamico

Xavier Noria fxnahashref.com
Dij Jul 5 08:12:33 PDT 2007


On Jul 5, 2007, at 3:40 PM, Xavier Pegenaute wrote:

> linea_1_del_cfg: regexp:"^(\d+)\s+(\d+)\s+(Test1)"     grupos:"$2: 
> $1:$3"
> linea_2_del_cfg: regexp:"^(\d+)\s+(\d+)\s+(Test2)"     grupos:"$3: 
> $2:$1"
>
> Para hacer el matching no tengo problema porque pongo directamente la
> cadena entre los m/.../, el problema viene con los grupos, por que al
> leerlo y ponerlo en una variable, obviamente no hace lo que yo  
> quiero :-):
>
>     if($linea =~ m/$matching/){
>         $datos = $varlocal
>     }
>
> Como podría solucionarlo?

La situacion ahi es que tienes el nombre de las variables y necesitas  
acceder a ellas en runtime. Afortunadamente son globales y ello es  
posible si strict refs esta deshabilitado:

   fxnafeynman:~/tmp$ cat foo.pl
   use strict;
   use warnings;

   my @groups = '$2:$1:$3' =~ /\d/g; # extract digits
   "foo" =~ /(.)(.)(.)/;
   foreach my $g (@groups) {
       no strict 'refs';
       print $$g, "\n";
   }
   fxnafeynman:~/tmp$ perl foo.pl
   o
   f
   o

Estas se llaman symbolic o soft references en argot (documentadas en  
perlref), y estan desaconsejadas en general porque suelen indicar que  
necesitas una tabla hash en realidad, pero en este caso su uso parece  
lo adecuado.

-- fxn



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