Para algo tan sencillo no necesitas usar split(). Con una expresión regular puedes localizar lo que quieres.
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
print "Escriba la URL: ";
my $url = <STDIN>;
if ($url =~ m{//([\w:]+)@}) {
print "Autenticación encontrada: $1\n";
}
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.
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 ':'
Using perl Syntax Highlighting
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
Using perl Syntax Highlighting
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.