Bonjour,
m'affiche actuellement : /home/user/Proj/test1.txt
Code : Sélectionner tout - Visualiser dans une fenêtre à part print FILE "$fic";
Mais j'aimerai seulement afficher test1
Est-ce possible?
Merci d'avance.
Bonjour,
m'affiche actuellement : /home/user/Proj/test1.txt
Code : Sélectionner tout - Visualiser dans une fenêtre à part print FILE "$fic";
Mais j'aimerai seulement afficher test1
Est-ce possible?
Merci d'avance.
En utilisant le package File::basename disponible sur CPAN.
Et ensuite :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 my $name = basename ($fic) ; print "$name\n" :
Le package s'appelle File::Basename (avec un B majuscule).
Et c'est effectivement la meilleure solution.
Sinon, une expression régulière le fait aussi:
Elle supprime tout ce qui précède le dernier /.
Code : Sélectionner tout - Visualiser dans une fenêtre à part ($basename = $fic) =~ s!^.*/!!;
- La programmation fonctionnelle en Perl : 1. Les opérateurs de liste; 2. Les fonctions d'ordre supérieur; 3. Étendre le langage.
- Comment utiliser des décorateurs en Perl: Un tutoriel pour changer le comportement d'une fonction sans en modifier le code source
- De Perl 5 à Perl 6 : 1. Les bases; 2. Les nouveautés; 3. Approfondissements; 4. Annexe 1: Ce qui change entre Perl 5 et Perl 6; Annexe 2: Les nouveautés de Perl 6.
- Les regex et grammaires de Perl 6
- Objets, classes et rôles en Perl 6 - Tutoriel de programmation orientée objet
- Tour d'horizon du nouveau langage Perl 6
Merci, j'ai utilisé l'expression régulière.
Mais j'aimerai aussi pouvoir supprimer le '.txt' si possible ?
Pareil, tu peux utiliser le paquetage File::Basename ou une seconde expression régulière:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ($basename = $fic) =~ s!^.*/!!; # supprime le chemin $basename =~ s/\.txt$//; # supprime le point et le suffixe
- La programmation fonctionnelle en Perl : 1. Les opérateurs de liste; 2. Les fonctions d'ordre supérieur; 3. Étendre le langage.
- Comment utiliser des décorateurs en Perl: Un tutoriel pour changer le comportement d'une fonction sans en modifier le code source
- De Perl 5 à Perl 6 : 1. Les bases; 2. Les nouveautés; 3. Approfondissements; 4. Annexe 1: Ce qui change entre Perl 5 et Perl 6; Annexe 2: Les nouveautés de Perl 6.
- Les regex et grammaires de Perl 6
- Objets, classes et rôles en Perl 6 - Tutoriel de programmation orientée objet
- Tour d'horizon du nouveau langage Perl 6
Effectivement, cela marche très bien, merci!
Mais, est-ce je peux avoir si possible une explication de ces 2 expressions régulières ?
car j'aimerai au final, passer de /home/user/Proj/test_def_ghi.txt
à def --> ghi
Je commence par la seconde, plus simple et plus naturelle:
s/\.txt$//;
s/// est l'opérateur de substitution (de remplacement). Entre les deux premières barres obliques, le texte à rechercher (expliqué plus bas); entre les deux suivantes le texte de remplacement (ici, rien puisque je veux remplacer ".txt" par rien, ce qui équivaut à supprimer ".txt"); après la dernière d'éventuelles options (inutilisé ici).
Le texte a rechercher est ".txt". Dans une expression régulière, douze caractères ont une signification spéciale, dont le "." et le "$". Comme le "." a une signification spéciale (n'importe quel caractère sauf un saut de ligne), si je veux reconnaître un "." normal de façon littérale, je le précède par \, ce qui veut dire: ici, je veux vraiment dire un ".", pas sa signification spéciale. "$" veux simplement dire fin de chaîne, autrement dit, je ne fais la substitution que si ".txt" est à la fin de la valeur de ma variable. L'expression régulière marcherait sans ce "$", mais on est plus sûr de ne pas faire d'erreur et cela permet au compilateur d'optimiser l'expression régulière.
s!^.*/!!;
L'opérateur s/// peut utiliser d'autres séparateurs que / (à peu près n'importe quel caractère non alpha-numérique. On peut l'écrire s{}{} ou s!!!, etc. Cela a un intérêt quand on recherche des / dans l'expression régulière, sinon il faudrait mettre un \ avant le / (comme je l'ai fait pour le "." dans l'autre expression régulière).
s!^.*/!!; est donc équivalent à s/^.*\///, mais un peu plus lisible.
Là encore, il s'agit de remplacer du texte par rien. Le text recherché est "^.*/", ce qui signifie: début de la variable (le ^), suivi par un caractère quelconque autre que le retour à la ligne (le ".") 0 ou plusieurs fois (le "*") suivi par un "/". Sachant que le * dit plus précisément 0 ou plusieurs fois, autant que je peux (le plus de fois possible), on dit que le * est gourmand. Donc le ".*" va aussi reconnaître des /, du moment qu'il peut trouver un / final. Bref il va rechercher tout ce qu'il peut depuis le début de la variable jusqu'au dernier / de la variable.
Je te laisse essayer de voir comment modifier ce "s!^.*/!!;" pour aller plus loin (bien sûr, je reste à ta disposition pour t'aider si tu n'y arrives pas).
Par contre, je ne pense pas que tu puisses avoir un nom de fichier de type "def --> ghi" (et même si tu y arrives, ce n'est pas souhaitable des noms de fichiers ayant des caractères spéciaux (espace, tiret, signe ">") sont une plaie à utiliser (souvent on n'arrive même pas à les effacer)). Je pense que tu devrais te contenter, pour un nom de fichier, de quelque chose comme def_ghi.
- La programmation fonctionnelle en Perl : 1. Les opérateurs de liste; 2. Les fonctions d'ordre supérieur; 3. Étendre le langage.
- Comment utiliser des décorateurs en Perl: Un tutoriel pour changer le comportement d'une fonction sans en modifier le code source
- De Perl 5 à Perl 6 : 1. Les bases; 2. Les nouveautés; 3. Approfondissements; 4. Annexe 1: Ce qui change entre Perl 5 et Perl 6; Annexe 2: Les nouveautés de Perl 6.
- Les regex et grammaires de Perl 6
- Objets, classes et rôles en Perl 6 - Tutoriel de programmation orientée objet
- Tour d'horizon du nouveau langage Perl 6
Merci beaucoup pour cette explication très détaillée.
Je ne voulais pas renommer le nom de mon fichier, mais simplement en extraire des données.
Voici ma méthode :
qui fonctionne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 (my $basename = $fic) =~ s/^.*\/test_(.*)_(.*)\.txt$/$1 --> $2/; print FILE "$basename\n";
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager