File::Spec->abs2rel renvoie parfois un chemin absolu...
Le
Manuel Pégourié-Gonnard
Bonjour,
Je suis parfois surpris par le résultat renvoyé par abs2rel() de
File::Spec::Functions. Par exemple :
abs2rel('/', '/')
renvoie '/' alors que je m'attendrais plus à '.' en fait. ('/' n'est pas
ce que j'ai l'habitude d'appeler un chemin relatif, et abs2rel('/foo/',
'/foo/') renvoie '.' comme je m'y attends).
Vu qu'il s'agit d'un module de base de Perl, je doute qu'il s'agisse
d'un bug, donc je me dis que c'est sans doute moi qui n'ai pas compris
la logique de la chose.
Qu'en pensez-vous ?
--
Manuel Pégourié-Gonnard Institut de mathématiques de Jussieu
http://weblog.elzevir.fr/ http://people.math.jussieu.fr/~mpg/
Je suis parfois surpris par le résultat renvoyé par abs2rel() de
File::Spec::Functions. Par exemple :
abs2rel('/', '/')
renvoie '/' alors que je m'attendrais plus à '.' en fait. ('/' n'est pas
ce que j'ai l'habitude d'appeler un chemin relatif, et abs2rel('/foo/',
'/foo/') renvoie '.' comme je m'y attends).
Vu qu'il s'agit d'un module de base de Perl, je doute qu'il s'agisse
d'un bug, donc je me dis que c'est sans doute moi qui n'ai pas compris
la logique de la chose.
Qu'en pensez-vous ?
--
Manuel Pégourié-Gonnard Institut de mathématiques de Jussieu
http://weblog.elzevir.fr/ http://people.math.jussieu.fr/~mpg/

Poser une question


Ca m'a tout l'air d'un bug.
(Marc Espie) écrivait (wrote):
Oui sans doute.. Mais d'un autre côté, ce n'est pas complètement
faux. Un chemin relatif à la racine est toujours un chemin absolu. En
fait, cela dépend du point de vue. ;-)
Sans trop y réfléchir, je ne vois pas de situation où ce cas
particulier pourrait poser des problèmes... mais je me trompe
peut-être.
--
Paul Gaborit - Perl en français -
La situation où ça m'a embêté est la suivante : un ensemble de pages web
qui pour l'instant utilisaient href="/" comme lien vers la page
d'accueil, et que je voulais remplacer par des liens relatifs de façon à
pouvoir déplacer ces pages dans un sous-répertoire. Je repère les pages
par leur chemin depuis l'accueil, de sorte que l'identifiant de la page
d'accueil est '/'.
Finalement j'ai utilisé le contournement suivant, qui suppose que les
arguments commencent tous les deux par '/'.
sub abs_to_rel {
my ($file, $base) = @_;
return File::Spec->abs2rel("/dummy$file", "/dummy$base");
}
--
Manuel Pégourié-Gonnard Institut de mathématiques de Jussieu
http://weblog.elzevir.fr/ http://people.math.jussieu.fr/~mpg/
Pas sur que abs2rel soit de toutes facons la totalite de la solution pour
ce cas precis, puisque tu consideres des url, qui ne sont pas forcement
des chemins au sens classique Unix. En particulier, tu gagneras sans doute
a canonicaliser tes url, sauf si tu es sur de ne jamais avoir de soucis cote
liens (pas un gros fan du .. dans l'url).
Mais bon, si on veut deplacer des trucs d'un endroit a l'autre, ben faudrait
pouvoir obtenir / -> .
Methode: j'ai un chemin absolu initial (ici /) que je veux rendre relatif a
sa racine courante (/), ce qui va me donner .
Je le deplace ailleurs, par exemple, en /rootme
si pwd = /rootme, alors . fait reference a /rootme, tandis que / fait toujours
reference a /
Je sais pas vous, mais pour moi c'est clair...
Manuel Pégourié-Gonnard
Pourquoi ne pas utiliser URI ? C'est fait pour gérer des URL (entre
autres) et la méthode 'rel' semble fonctionner comme tu le souhaites :
use URI;
$a = URI->new("http://www.perl.com");
print $a, "n";
$b = $a->abs("/");
print $b, "n";
print $b->rel($a), "n";
--
Paul Gaborit - Perl en français -