• Publicidad

Expresiones regulares y función split

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

Expresiones regulares y función split

Notapor ReNcOoR » 2009-11-22 12:41 @570

Hola amigos, he creado un pequeño script en Perl para que me corte un trozo de una frase y me la guarde pero no he podido obtener los resultados esperados. Quisiera que esta frase:
h**p://mtomlin:[email protected]
me la partiera y me la dejara solo así:
mtomlin:picard

Un saludo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5. use diagnostics;
  6.  
  7. print "Escriba la url.\n";
  8.  
  9. my $url = <STDIN>;
  10.  
  11. if ($url =~ /:/) {
  12.  
  13.     my @datos = split (/\/\/(.+)@/,$url);
  14.  
  15.     print "frase encontrada\n";
  16.  
  17.     print @datos;
  18. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2009-11-22 12:46 @574, editado 1 vez en total
Razón: Ortografía, bloques de código, indentación del código
ReNcOoR
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2009-11-16 18:45 @823

Publicidad

Re: Expresiones regulares y función split

Notapor explorer » 2009-11-22 13:17 @595

Para algo tan sencillo no necesitas usar split(). Con una expresión regular puedes localizar lo que quieres.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. print "Escriba la URL: ";
  7. my $url = <STDIN>;
  8.  
  9. if ($url =~ m{//([\w:]+)@}) {
  10.     print "Autenticación encontrada: $1\n";
  11. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

La expresión regular hace lo siguiente:
  • busca por dos caracteres '/'
  • comienza a capturar lo que sigue, con la ayuda de los paréntesis
  • lo que queremos capturar es un conjunto ([]) de uno o más (+) caracteres alfanuméricos (\w) y/o el carácter ':'
  • y, finalmente, lo que debe ocurrir es que después encontremos una arroba
Si el patrón de la expresión regular coincide con lo que hay en la $url, entonces sabemos que Perl nos habrá dejado en $1 el resultado de la captura. Y eso es lo que mostramos.
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
explorer@casa:~/Documents/Desarrollo> ./kk.pl
Escriba la URL: h**p://mtomlin:[email protected]
Autenticación encontrada: mtomlin:picard
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Pero hay un fallo... para URL como esta: h**p://[email protected], también nos dará un resultado. Y solo queremos los resultados en los que también aparezca la contraseña.

Hay que cambiar la expresión regular para obligar a la presencia de ':'
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ($url =~ m{//(\w+:\w+)@}) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Ahora ya estamos diciendo que lo queremos capturar es un par de conjuntos de caracteres alfanuméricos, separados por ':'.

Actualización: la solución sencilla
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ($url =~ m{//(.+?)@}) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

también funciona, claro, aunque es menos visual, y no obliga a la presencia de ':'. Lo que sí ponemos es un '?' para decir que entre los '//' y la '@' existan el menor número posible de caracteres capturados.
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: Expresiones regulares y función split

Notapor ReNcOoR » 2009-11-22 14:11 @633

Gracias, explorer, solo una duda. ¿Por qué en el primer ejemplo está la variable $1? Se supone que no la declaraste en ningún lado; ¿eso te debería dar error? Un saludo.
ReNcOoR
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2009-11-16 18:45 @823

Re: Expresiones regulares y función split

Notapor explorer » 2009-11-22 14:16 @636

Perl tiene muchas variables especiales.

$1 almacena lo capturado por el primer par de paréntesis, igual que $2 lo haría con el segundo, $3 con el tercero, etc.

Tú, prueba el programa y verás si sale o no algún error.

;)

PD: yo pruebo todos los programas que publico.
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

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

cron