Bonjour,
je souhaite verifier la présence d'un executable dans le path, ou localement.
Je me pose la question suivante :
Est ce que -x permet de verifier dans le path ?
MerciCode:print 'trouvé !' if (-x 'appli');
Z.
Version imprimable
Bonjour,
je souhaite verifier la présence d'un executable dans le path, ou localement.
Je me pose la question suivante :
Est ce que -x permet de verifier dans le path ?
MerciCode:print 'trouvé !' if (-x 'appli');
Z.
Non, en revanche, tu peux utiliser une commande genre which, whence ou whereis ?
Tu peux utiliser la variable $ENV{PATH}
perlvar : %ENV
EDIT : -x permet simplement de vérifier si le fichier est un exécutable. Par défaut si aucun chemin n'est indiqué pour ce fichier, perl regardera dans le répertoire où est exécuté le script.
Je pense que tu fais reférence aux commandes de la console linux.
Dans la limite du possible, je voudrais eviter ce genre de chose pour des histoires de portabilité du code sur les autres plateformes.
Je vais faire autrement :
je vais lancer l'executable, capturer le message qu'il est sensé renvoyer. si il est absent, message d'insulte...
Z.
Jasmine > Oui, j'y ai pensé, mais faut tester tous les chemins. J'hesitais entre cette solution et celle que je viens d'exposer.
Z.
Finalement, j'ai opté pour cela :p
Code:
1
2
3
4
5
6
7
8
9 sub _get_exec_path { my ($this, $exec) = @_; foreach my $path ( split( /:/, $ENV{PATH} ) ) { if (-x "$path/$exec") { return "$path/$exec"; } } return 0; }
Pour éviter le foreach tu peux directement faire
... tu fais un split sur : ... chez moi, ce sont des ; qui séparent mes chemins.Code:
1
2
3
4
5
6
7
8
9 sub _get_exec_path { my ($this, $exec) = @_; if ( ($ENV{PATH} =~ m{:$path/$exec:}) && (-x "$path/$exec") ){ return "$path/$exec"; } return 0; }
faut que je fasse un split sur : et ; alors.
Par contre, pourrais tu m'expliquer la syntaxe de : {:$path/$exec:}
car pour moi, ca signifie que le path doit commencer et finir par ':' et doit contenir aussi l'executable, ce qui n'est pas le cas. le path contenant que des dossiers
De plus, cela me retourne une erreur :
Use of uninitialized value in concatenation (.) or string at test_perl_obj.pl line 10.
Ma boucle actuelle avec la modif du ';' et pour tester le repertoir courant :Code:
1
2
3
4
5
6 my $path; my $exec = 'seqmap'; if ( ($ENV{PATH} =~ m{:$path/$exec:}) && (-x "$path/$exec") ){ print "$path/$exec"; } exit;
Merci Jasmine pour tes conseils.Code:
1
2
3
4
5
6
7
8 my $path; my $exec = 'seqmap'; foreach my $path ( split( /;|:/, $ENV{PATH} ), './' ) { if (-x "$path/$exec") { print "$path/$exec"; } }
Z.
Oui, tu as raison
Par exemple, voici le début du contenu de mon $ENV{PATH}
J'avais utilisé les : ( ; chez moi) afin de délimiter le chemin pour éviter de matcher un sous-répertoire du répertoire que tu recherches. Mais vu que le premier et dernier chemin de $ENV{PATH} ne commence et ne se termine pas par ; ... cela ne fonctionnera que si le répertoire cherché n'est ni le premier, ni le dernier.Citation:
C:\Perl\site\bin;C:\Perl\bin;C:\oracle\ora92\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\Fichiers communs\Adaptec Shared\System
Dans mon cas, je ferais donc
Est-ce plus clair?Code:
1
2
3
4
5
6
7
8
9 sub _get_exec_path { my ($this, $exec) = @_; if ( ($ENV{PATH} =~ m{;$path;}) && (-x "$path/$exec") ){ return "$path/$exec"; } return 0; }
Peut-être le mieux est-il d'utiliser
Code:m{\b$path\b}