L'astuce est de déterminer la façon dont vous voulez jolie imprimer chaque type d'URL, donc dans ce cas, vous devez dire votre script quoi faire dans chaque cas:
use URI;
while(<DATA>) {
chomp;
my $uri = URI->new($_);
my $s = $uri->scheme;
my $rest = do {
if($s =~ /(?:https?|ftp)/) {
$uri->host . $uri->path_query
}
elsif($s eq 'mailto') {
$uri->path
}
elsif(! $s) {
$uri
}
};
print "$uri -> $rest\n";
}
__END__
http://www.example.com/foo/bar.html
www.example.com/foo/bar.html
ftp://www.example.com
mailto:[email protected]
https://www.example.com/foo?a=b;c=d
http://joe:[email protected]/login
Ce produit:
http://www.example.com/foo/bar.html -> www.example.com/foo/bar.html
www.example.com/foo/bar.html -> www.example.com/foo/bar.html
ftp://www.example.com -> www.example.com
mailto:[email protected] -> [email protected]
https://www.example.com/foo?a=b;c=d -> www.example.com/foo?a=b;c=d
http://joe:[email protected]/login -> www.example.com/login
Si vous voulez quelque chose de différent pour une URL particulière, il vous suffit de créer une branche et d'assembler les parties souhaitées. Notez que le URI
gère également les adresses URI sans nom.
Si vous ne voulez pas de longues chaînes URI pour votre jolie impression, vous pouvez jeter quelque chose comme ça pour couper la chaîne après tant de personnages:
substr($rest, 20) = '...' if length $rest > 20;
est ici une solution avec given
, qui est légèrement plus propre, mais aussi un peu plus laide. Ceci est la version Perl 5,010:
use 5.010;
use URI;
while(<DATA>) {
chomp;
my $uri = URI->new($_);
my $r;
given($uri->scheme) {
when(/(?:https?|ftp)/ ) { $r = $uri->host . $uri->path_query }
when('mailto') { $r = $uri->path }
default { $r = $uri }
}
print "$uri -> $r\n";
}
Il est plus laid parce que je dois répéter que l'affectation à $r
. Perl 5.14 va corriger cela tout en laissant given
avoir une valeur de retour. Puisque cette version stable est pas encore disponible, vous devez utiliser la piste 5,13 expérimentale:
use 5.013004;
use URI;
while(<DATA>) {
chomp;
my $uri = URI->new($_);
my $r = do {
given($uri->scheme) {
when(/(?:https?|ftp)/ ) { $uri->host . $uri->path_query }
when('mailto') { $uri->path }
default { $uri }
}
};
print "$uri -> $r\n";
}
Pourquoi? Ce n'est pas comme il fait toutes les choses qu'il demande? –
URI :: split fait exactement ce qu'il demande ... je pense. – Powertieke
Bien sûr, le module URI fait ce qu'il demande. Je te montre comment le faire. –