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/
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
espie
Le #20615351
In article 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 ?



Ca m'a tout l'air d'un bug.
Paul Gaborit
Le #20615941
À (at) Mon, 23 Nov 2009 16:39:18 +0000 (UTC),
(Marc Espie) écrivait (wrote):

In article 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 ?



Ca m'a tout l'air d'un bug.



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 -
Manuel Pégourié-Gonnard
Le #20616171
Paul Gaborit scripsit :


À (at) Mon, 23 Nov 2009 16:39:18 +0000 (UTC),
(Marc Espie) écrivait (wrote):

In article Manuel Pégourié-Gonnard
Qu'en pensez-vous ?



Ca m'a tout l'air d'un bug.



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.



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/
espie
Le #20616971
In article Manuel Pégourié-Gonnard
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");
}



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...
Paul Gaborit
Le #20619421
À (at) Mon, 23 Nov 2009 19:01:36 +0100 (CET),
Manuel Pégourié-Gonnard
Paul Gaborit scripsit :


À (at) Mon, 23 Nov 2009 16:39:18 +0000 (UTC),
(Marc Espie) écrivait (wrote):

In article Manuel Pégourié-Gonnard
Qu'en pensez-vous ?



Ca m'a tout l'air d'un bug.



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.



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");
}



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 -
Manuel Pégourié-Gonnard
Le #20621171
Paul Gaborit scripsit :

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";



En effet. Je ne l'ai pas utilisé parce que je ne connaissais pas et
n'avais pas pensé à chercher, mais visiblement c'était plus adapté.
Bon, j'avais fini par m'en sortir avec File::Spec, donc je ne vais
peut-être pas ré-écrire le truc maintenant, mais je garde ça sous le
coude pour une prochaine fois.

--
Manuel Pégourié-Gonnard Institut de mathématiques de Jussieu
http://weblog.elzevir.fr/ http://people.math.jussieu.fr/~mpg/
Manuel Pégourié-Gonnard
Le #20621161
Marc Espie scripsit :

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.



Disons que je travaille uniquement sur la partie qui correspond plus ou
moins dans les faits à un chemin Unix. Mais comme le fait remarquer
Paul, URI aurait effectivement été plus adapté.

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).



Normalement, je m'en sert uniquement pour des liens comme

<link href="../../style.css" [...]

Il me semble que dans ce cas, l'URL sera construite par l'agent
utilisateur de façon correcte.

Ceci dit, je viens de remarquer que j'étais sur le point de mettre en
ligne le même site sur deux serveurs différents, et que niveau SEO c'est
sans doute une grosse bêtise.

Mais bon, si on veut deplacer des trucs d'un endroit a l'autre, ben faudrait
pouvoir obtenir / -> .



Oui, c'est précisément ce qui me dérangeait avec le comportement de
abs2rel().

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...



Je crois que oui.

--
Manuel Pégourié-Gonnard Institut de mathématiques de Jussieu
http://weblog.elzevir.fr/ http://people.math.jussieu.fr/~mpg/
Publicité
Poster une réponse
Anonyme