GNT sans publicité, site mobile, fonctionnalitées exclusives...

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/
Lire les 7 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
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 -
Publicité
Suivre les réponses
Poster une réponse
Anonyme