• Publicidad

Comodines (wildcards)

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Comodines (wildcards)

Notapor primitivo » 2015-07-20 20:52 @911

Con el siguiente código capturo los caracteres que coinciden con los comodines '?' y '*', es decir:
? -> coincide con el carácter que esté en esa posición
* -> coincide con el/los caracteres que estén en principio, dentro o al final y justo antes del carácter siguiente

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $cadena = 'bb??vt*u'; #aqui la formula equivale a n+1 = 'u'
  2. my $cadena2 = "bbazvteeeeeeeertyXdfu";
  3. for (my $y = length($cadena2),$x = 0;$x<=$y;$x++) {
  4.   if (substr($cadena2,$x,1)) {
  5.     switch (my $a = substr($cadena,$x,1)) {
  6.       case '?' {
  7.         #print "caracter " . substr($cadena2,index($cadena,'?',$x),1) . "\n";
  8.         $strcpy+=substr($cadena2,index($cadena,'?',$x),1);
  9.       }
  10.       case '*' {
  11.         $posicion = index($cadena,'*',1);
  12.         if (my $ps = substr($cadena,$posicion+1,1)) {
  13.           $xx=0;
  14.           while (substr($cadena2,$posicion+$xx,1) ne $ps) {
  15.             $strcpy.=substr($cadena2,$posicion+$xx,1);
  16.             $xx++;
  17.           }
  18.           print "capturado: $strcpy\n";
  19.         }
  20.       }
  21.       else {
  22.         if (uc(substr($cadena2,$x,1)) eq uc(substr($cadena,$x,1))) {
  23.           $strcpy+=substr($cadena2,$x,1);
  24.         }
  25.       }
  26.     }
  27.   }
  28. }
  29.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Pero tiene un fallo: si encuentra un carácter igual al que está justo después de '*' (en este caso, 'u') la comprobación se detiene. Por ejemplo si $cadena2 tuviese como valor "bbazvteeeeueeeertyXdfu".

¿Cómo podría hacerse mejor? ¿O estoy "reinventando la rueda"?
primitivo
Perlero nuevo
Perlero nuevo
 
Mensajes: 80
Registrado: 2013-03-22 23:05 @004

Publicidad

Re: Comodines (wildcards)

Notapor explorer » 2015-07-20 21:20 @930

Pues yo creo que sí que estás reinventando la rueda... ;)
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use feature 'say';
  3. use Regexp::Wildcards;
  4.  
  5. my $patron = 'bb??vt*u';
  6. my $cadena = "bbazvteeeeeueertyXdfu";
  7.  
  8. my $rw = Regexp::Wildcards->new(type => 'win32');
  9. $rw->capture('single');
  10. $rw->capture(add => [ qw<any greedy> ]);
  11.  
  12. my $re = $rw->convert($patron);         # lo pasamos a expresión regular
  13.  
  14. #say "$re";                             # bb(.)(.)vt(.*)u
  15.  
  16. if ($cadena =~ $re) {
  17.     say "Sí coincide: \$1:[$1] \$2:[$2] \$3:[$3]";     # Sí coincide: $1:[a] $2:[z] $3:[eeeeeueertyXdf]
  18. }
  19. else {
  20.     say "No coincide";
  21. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

El módulo Regexp::Wildcards convertirá un patrón, en este caso de tipo DOS o Win32, a una expresión regular. Solo tenemos que aplicarla a la $cadena, y listo.

Pero incluso puedes hacerlo sin el módulo: te vale con sustituir cada aparición de '?' por un '(.)' y de un '*' por un '(.*)', y ya está.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Comodines (wildcards)

Notapor primitivo » 2015-07-20 21:49 @951

¡Ostia! xD

Gracias :DDDDDDDDDDDDDD
primitivo
Perlero nuevo
Perlero nuevo
 
Mensajes: 80
Registrado: 2013-03-22 23:05 @004


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 17 invitados