Apprentissage de Perl
Résolu
artagon7
Messages postés
417
Date d'inscription
Statut
Membre
Dernière intervention
-
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
Salut lami20j,
Je n'aborderai pas ce soir le script que j'ai écrit et qui ne fonctionne pas. Ca va aller à plus tard car malheureusement j'ai d'autres travaux à effectuer.
J'aimerais cependant pour débuter cette discussion poser une question très générale.
Q-1 Je suis très curieux de savoir si on peut lier Perl à Access (ou à toutes autres bases de données)? C'est-à-dire, par exemple, est-ce que je peux envoyer le contenu d'une variable Perl (par exemple $3) dans une table présente dans une base de données? (J'espère que c'est le cas car ça pourrait m'être très utile ... et peut-être à d'autres également!)
Merci
Je n'aborderai pas ce soir le script que j'ai écrit et qui ne fonctionne pas. Ca va aller à plus tard car malheureusement j'ai d'autres travaux à effectuer.
J'aimerais cependant pour débuter cette discussion poser une question très générale.
Q-1 Je suis très curieux de savoir si on peut lier Perl à Access (ou à toutes autres bases de données)? C'est-à-dire, par exemple, est-ce que je peux envoyer le contenu d'une variable Perl (par exemple $3) dans une table présente dans une base de données? (J'espère que c'est le cas car ça pourrait m'être très utile ... et peut-être à d'autres également!)
Merci
A voir également:
- Apprentissage de Perl
- Denon perl pro test - Accueil - Audio
- Active perl - Télécharger - Édition & Programmation
- Logiciel apprentissage - Guide
- Apprentissage guidé gemini - Guide
- Telecharger logiciel d'apprentissage du clavier gratuit - Télécharger - Divers Bureautique
12 réponses
Bonjour,
Oui, c'est possible, mais je ne suis pas expert dans le domaine,
je préfère donc pas te donner des mauvais conseils.
Il faut malheureusement, que tu attendes que quelqu'un de
plus expérimenté que moi te répondre.
Oui, c'est possible, mais je ne suis pas expert dans le domaine,
je préfère donc pas te donner des mauvais conseils.
Il faut malheureusement, que tu attendes que quelqu'un de
plus expérimenté que moi te répondre.
Salut,
Avec Perl on peut faire beaucoup des choses.
Il ne faut pas oublier qu'il y a le CPAN (Comprehensive Perl Archive Network) où on peut trouver pas mal de modules qui ferront le travail à notre place (j'ai oublié de dire que les perliens ce sont des paresseux - tu veux toujours apprendre Perl ;-))
Pour accèder aux bases de données il y a plusieurs modules
DBI
Class::DBI::MSAccess
DBD::ODBC
pour convertire une base Access vers une autre base DBIx::MSAccess::Convert2Db
pour les drivers
DBI::DBD
Voilà pour la question ;-))
Avec Perl on peut faire beaucoup des choses.
Il ne faut pas oublier qu'il y a le CPAN (Comprehensive Perl Archive Network) où on peut trouver pas mal de modules qui ferront le travail à notre place (j'ai oublié de dire que les perliens ce sont des paresseux - tu veux toujours apprendre Perl ;-))
Pour accèder aux bases de données il y a plusieurs modules
DBI
Class::DBI::MSAccess
DBD::ODBC
pour convertire une base Access vers une autre base DBIx::MSAccess::Convert2Db
pour les drivers
DBI::DBD
Voilà pour la question ;-))
Bonjour,
Apprendre PERL : https://perl.developpez.com/cours/
Si tu as des questions, tu as les réponses dans la F.A.Q PERL : https://perl.developpez.com/faq/
Apprendre PERL : https://perl.developpez.com/cours/
Si tu as des questions, tu as les réponses dans la F.A.Q PERL : https://perl.developpez.com/faq/
Salut,
Si tu as des questions, tu as les réponses dans la F.A.Q PERL
Pas toutes ;-)
Les questions peuvent variées.
Pour ce qui concerne la documentation Perl, le meilleur choix c'est le livre écrit par Larry WALL lui même Programmation Perl, je t'assure que ça vaut le coup si Perl t'interesse.
Si l'anglais ne te pose pas des problèpmes regarde les livres en ligne sur Perl
En 2ème position je mettrais Documentation Perl en français
Si tu as des questions, tu as les réponses dans la F.A.Q PERL
Pas toutes ;-)
Les questions peuvent variées.
Pour ce qui concerne la documentation Perl, le meilleur choix c'est le livre écrit par Larry WALL lui même Programmation Perl, je t'assure que ça vaut le coup si Perl t'interesse.
Si l'anglais ne te pose pas des problèpmes regarde les livres en ligne sur Perl
En 2ème position je mettrais Documentation Perl en français
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Merci pour vos réponses,
Donc, c'est quand même bien que Perl puisse interagir avec des bases de données. J'étais à peu près certain que c'était le cas. Je vais essayer d'obtenir le livre de Wall et je vais aller faire un tour sur le CPAN pour avoir une vue générale des possibilités de Perl. Je vais également aller voir la FAQ dont parle Tobydélice.
Encore merci et salutations à tous,
Donc, c'est quand même bien que Perl puisse interagir avec des bases de données. J'étais à peu près certain que c'était le cas. Je vais essayer d'obtenir le livre de Wall et je vais aller faire un tour sur le CPAN pour avoir une vue générale des possibilités de Perl. Je vais également aller voir la FAQ dont parle Tobydélice.
Encore merci et salutations à tous,
Salut,
Pour utilisez la FAQ (frequently ask question ou foire aux questions), vaut mieux savoir quoi demander ;-)
Mieux vaux lire des tutoriaux.
Pour l'info
Semble-t-il que Tobydélice est un fan de devellopez.com puisque ce sont les seuls réponses qu'il donne
Voici quelques exemples.
http://www.commentcamarche.net/forum/affich 4021547 applications sur les fichiers#dernier
http://www.commentcamarche.net/forum/affich 4021782 access#dernier
http://www.commentcamarche.net/forum/affich 4022898 crystal report 9 et vb 2005#dernier
http://www.commentcamarche.net/forum/affich 4023397 stat sql serveur#dernier
Pour utilisez la FAQ (frequently ask question ou foire aux questions), vaut mieux savoir quoi demander ;-)
Mieux vaux lire des tutoriaux.
Pour l'info
Semble-t-il que Tobydélice est un fan de devellopez.com puisque ce sont les seuls réponses qu'il donne
Voici quelques exemples.
http://www.commentcamarche.net/forum/affich 4021547 applications sur les fichiers#dernier
http://www.commentcamarche.net/forum/affich 4021782 access#dernier
http://www.commentcamarche.net/forum/affich 4022898 crystal report 9 et vb 2005#dernier
http://www.commentcamarche.net/forum/affich 4023397 stat sql serveur#dernier
Bonjour,
Pour répondre à lami20j, mon but n'est pas d'en apprendre autant qu'un administrateur de réseaux Linux/Unix mais simplement d'en apprendre suffisamment pour les applications que je désire faire (traitement de fichiers sous forme de tri et interactions avec des bases de données et des chiffriers électroniques.) Je veux surtout mettre l'accent sur le langage C que je dois réapprendre (plus tard ce sera C++). Avec le C et la base de Perl, je serai en F-1. Les liens que tu m'as donnes concernant les modules DBI, DBD et ODBC vont m'etre tres utiles.
Je voudrais soumettre un script qui tente de trier des lignes représentant des fichiers musicaux présents dans un répertoire (Mon script est basé sur un script que lami20j a écrit). Voici mes lignes a trier :
-r-xr-xr-x 1 1977910 2002-04-01 15:43 e_can_heart[1976]-dreamboat_annie-[128].mp3
-r-xr-xr-x 1 5538881 2006-04-14 22:02 e_gbr_eno_brian[1975]-mother_whale_eyeless-[128].mp3
-r-xr-xr-x 1 5794058 2006-03-25 06:01 e_gbr_king_crimson[1969]-cadence_and_cascade-[166].mp3
-r-xr-xr-x 1 2428835 2007-08-04 03:05 e_gbr_peter_and_gordon[1965]-everyones_gone_to_the_moon-[128].mp3
-r-xr-xr-x 1 4304271 2006-04-02 00:36 e_gbr_sweet[1974]-restless-[132].mp3
Les deux critères que j'ai choisis pour trier mes lignes sont :
1) le taux d'échantillonnage;
2) l'année.
Donc, je devrais obtenir le résultat suivant :
-r-xr-xr-x 1 2428835 2007-08-04 03:05 e_gbr_peter_and_gordon[1965]-everyones_gone_to_the_moon-[128].mp3
-r-xr-xr-x 1 5538881 2006-04-14 22:02 e_gbr_eno_brian[1975]-mother_whale_eyeless-[128].mp3
-r-xr-xr-x 1 1977910 2002-04-01 15:43 e_can_heart[1976]-dreamboat_annie-[128].mp3
-r-xr-xr-x 1 4304271 2006-04-02 00:36 e_gbr_sweet[1974]-restless-[132].mp3
-r-xr-xr-x 1 5794058 2006-03-25 06:01 e_gbr_king_crimson[1969]-cadence_and_cascade-[166].mp3
J'obtiens plutôt
-r-xr-xr-x 1 1977910 2002-04-01 15:43 e_can_heart[1976]-dreamboat_annie-[128].mp3
-r-xr-xr-x 1 5538881 2006-04-14 22:02 e_gbr_eno_brian[1975]-mother_whale_eyeless-[128].mp3
-r-xr-xr-x 1 5794058 2006-03-25 06:01 e_gbr_king_crimson[1969]-cadence_and_cascade-[166].mp3
-r-xr-xr-x 1 2428835 2007-08-04 03:05 e_gbr_peter_and_gordon[1965]-everyones_gone_to_the_moon-[128].mp3
-r-xr-xr-x 1 4304271 2006-04-02 00:36 e_gbr_sweet[1974]-restless-[132].mp3
C'est-a-dire que rien ne bouge!
Voici mon script Perl :
#!/usr/bin/perl
while(<DATA>){
/^-(.*):\d{2}(\w)_(\w{3})_(\w*)\[(\d{4})\]-(\w*)-\[(\d{3})\]\.mp3$/;
chomp;
push @nontrie,[$_,$2,$3,$4,$5,$6,$7];
}
@trie = map {$_->[0] }
sort {
$a->[7] <=> $b->[7]
||
$a->[5] <=> $b->[5]
} @nontrie;
print "$_\n" for @trie;
__END__
-r-xr-xr-x 1 1977910 2002-04-01 15:43 e_can_heart[1976]-dreamboat_annie-[128].mp3
-r-xr-xr-x 1 5538881 2006-04-14 22:02 e_gbr_eno_brian[1975]-mother_whale_eyeless-[128].mp3
-r-xr-xr-x 1 5794058 2006-03-25 06:01 e_gbr_king_crimson[1970]-cadence_and_cascade-[166].mp3
-r-xr-xr-x 1 2428835 2007-08-04 03:05 e_gbr_peter_and_gordon[1965]-everyones_gone_to_the_moon-[128].mp3
-r-xr-xr-x 1 4304271 2006-04-02 00:36 e_gbr_sweet[1974]-restless-[132].mp3
Explication de mon script :
/^-(.*):\d{2}\s(\w)_(\w{3})_(\w*)\[(\d{4})\]-(\w*)-\[(\d{3})\]\.mp3$/;
- : Toutes les lignes commencent avec le trait d'union
(.*) : Prend tous les caracteres avant les deux-points : ($1)
: : deux-points
\d{2} : Apres les deux-points, il y a necessairement deux entiers
\s : Espacement
(\w) : Prend le caractere designe pour la langue, ici apres l'espacement : ($2)
_ : Correspond au premier sousligne
(\w{3}) : Correspond a la nationalite : ($3)
_ : Correspond au deuxieme sousligne
(\w*) : Correspond a l'artiste : ($4)
\[ : Correspond a [
(\d{4}) : Correspond a l'annee : ($5)
\] : Correspond a ]
-(\w*)- : Correspond au titre de la chanson : ($6)
\[ : Correspond a [
(\d{3}) : Correspond au taux : ($7)
\]\.mp3$/; : Correspond a ].mp3
Je trie ensuite par rapport a $7 et $5.
Voici le script de lami20j qui trie des images par les valeurs des resolutions et par l'annee (et qui fonctionne bien).
#!/usr/bin/perl
while(<DATA>){
/.*:\d+\s+(.*)\[(\d+)x(\d+)\](\d{4})\..*/;
chomp;
push @nontrie,[$_,$2,$3,$4];
}
@trie = map {$_->[0] }
sort {
$a->[1] <=> $b->[1]
||
$a->[2] <=> $b->[2]
||
$a->[3] <=> $b->[3]
} @nontrie;
print "$_\n" for @trie;
__END__
-rwxrwx--- 1 53460 2007-10-07 02:29 600px-V838_Mon_HST[600x600]1999.jpg
-rwxrwx--- 1 53460 2007-10-07 02:29 abc[600x600]1999.jpg
-rwxrwx--- 1 53460 2007-10-07 02:29 abc[600x600]1997.jpg
-rwxrwx--- 1 53460 2007-10-07 02:29 Abc[600x600]1997.jpg
-rwxrwx--- 1 53460 2007-10-07 02:29 acb[600x600]1997.jpg
-rwxrwx--- 1 53460 2007-10-07 02:29 A00px-V838_Mon_HST[600x600]1999.jpg
-rwxrwx--- 1 69991 2007-10-07 02:27 739px-Omega_Nebula[739x600]1996.jpg
-rwxrwx--- 1 37021 2007-10-07 02:26 NGC2080[600x601]1998.jpg
-rwxrwx--- 1 138525 2007-10-07 02:25 603px-Crab_Nebula[603x600]1997.jpg
-rwxrwx--- 1 525752 2007-10-07 02:24 ESO97-13[1280x1280]1999.jpg
-rwxrwx--- 1 88098 2007-10-07 02:24 600px-ESO97-13[600x600]1997.jpg
Je ne comprends pas que le mien ne fonctionne pas. Ou est l'erreur? J'ai hate de savoir ce qui fait defaut!
Merci, :-)
Pour répondre à lami20j, mon but n'est pas d'en apprendre autant qu'un administrateur de réseaux Linux/Unix mais simplement d'en apprendre suffisamment pour les applications que je désire faire (traitement de fichiers sous forme de tri et interactions avec des bases de données et des chiffriers électroniques.) Je veux surtout mettre l'accent sur le langage C que je dois réapprendre (plus tard ce sera C++). Avec le C et la base de Perl, je serai en F-1. Les liens que tu m'as donnes concernant les modules DBI, DBD et ODBC vont m'etre tres utiles.
Je voudrais soumettre un script qui tente de trier des lignes représentant des fichiers musicaux présents dans un répertoire (Mon script est basé sur un script que lami20j a écrit). Voici mes lignes a trier :
-r-xr-xr-x 1 1977910 2002-04-01 15:43 e_can_heart[1976]-dreamboat_annie-[128].mp3
-r-xr-xr-x 1 5538881 2006-04-14 22:02 e_gbr_eno_brian[1975]-mother_whale_eyeless-[128].mp3
-r-xr-xr-x 1 5794058 2006-03-25 06:01 e_gbr_king_crimson[1969]-cadence_and_cascade-[166].mp3
-r-xr-xr-x 1 2428835 2007-08-04 03:05 e_gbr_peter_and_gordon[1965]-everyones_gone_to_the_moon-[128].mp3
-r-xr-xr-x 1 4304271 2006-04-02 00:36 e_gbr_sweet[1974]-restless-[132].mp3
Les deux critères que j'ai choisis pour trier mes lignes sont :
1) le taux d'échantillonnage;
2) l'année.
Donc, je devrais obtenir le résultat suivant :
-r-xr-xr-x 1 2428835 2007-08-04 03:05 e_gbr_peter_and_gordon[1965]-everyones_gone_to_the_moon-[128].mp3
-r-xr-xr-x 1 5538881 2006-04-14 22:02 e_gbr_eno_brian[1975]-mother_whale_eyeless-[128].mp3
-r-xr-xr-x 1 1977910 2002-04-01 15:43 e_can_heart[1976]-dreamboat_annie-[128].mp3
-r-xr-xr-x 1 4304271 2006-04-02 00:36 e_gbr_sweet[1974]-restless-[132].mp3
-r-xr-xr-x 1 5794058 2006-03-25 06:01 e_gbr_king_crimson[1969]-cadence_and_cascade-[166].mp3
J'obtiens plutôt
-r-xr-xr-x 1 1977910 2002-04-01 15:43 e_can_heart[1976]-dreamboat_annie-[128].mp3
-r-xr-xr-x 1 5538881 2006-04-14 22:02 e_gbr_eno_brian[1975]-mother_whale_eyeless-[128].mp3
-r-xr-xr-x 1 5794058 2006-03-25 06:01 e_gbr_king_crimson[1969]-cadence_and_cascade-[166].mp3
-r-xr-xr-x 1 2428835 2007-08-04 03:05 e_gbr_peter_and_gordon[1965]-everyones_gone_to_the_moon-[128].mp3
-r-xr-xr-x 1 4304271 2006-04-02 00:36 e_gbr_sweet[1974]-restless-[132].mp3
C'est-a-dire que rien ne bouge!
Voici mon script Perl :
#!/usr/bin/perl
while(<DATA>){
/^-(.*):\d{2}(\w)_(\w{3})_(\w*)\[(\d{4})\]-(\w*)-\[(\d{3})\]\.mp3$/;
chomp;
push @nontrie,[$_,$2,$3,$4,$5,$6,$7];
}
@trie = map {$_->[0] }
sort {
$a->[7] <=> $b->[7]
||
$a->[5] <=> $b->[5]
} @nontrie;
print "$_\n" for @trie;
__END__
-r-xr-xr-x 1 1977910 2002-04-01 15:43 e_can_heart[1976]-dreamboat_annie-[128].mp3
-r-xr-xr-x 1 5538881 2006-04-14 22:02 e_gbr_eno_brian[1975]-mother_whale_eyeless-[128].mp3
-r-xr-xr-x 1 5794058 2006-03-25 06:01 e_gbr_king_crimson[1970]-cadence_and_cascade-[166].mp3
-r-xr-xr-x 1 2428835 2007-08-04 03:05 e_gbr_peter_and_gordon[1965]-everyones_gone_to_the_moon-[128].mp3
-r-xr-xr-x 1 4304271 2006-04-02 00:36 e_gbr_sweet[1974]-restless-[132].mp3
Explication de mon script :
/^-(.*):\d{2}\s(\w)_(\w{3})_(\w*)\[(\d{4})\]-(\w*)-\[(\d{3})\]\.mp3$/;
- : Toutes les lignes commencent avec le trait d'union
(.*) : Prend tous les caracteres avant les deux-points : ($1)
: : deux-points
\d{2} : Apres les deux-points, il y a necessairement deux entiers
\s : Espacement
(\w) : Prend le caractere designe pour la langue, ici apres l'espacement : ($2)
_ : Correspond au premier sousligne
(\w{3}) : Correspond a la nationalite : ($3)
_ : Correspond au deuxieme sousligne
(\w*) : Correspond a l'artiste : ($4)
\[ : Correspond a [
(\d{4}) : Correspond a l'annee : ($5)
\] : Correspond a ]
-(\w*)- : Correspond au titre de la chanson : ($6)
\[ : Correspond a [
(\d{3}) : Correspond au taux : ($7)
\]\.mp3$/; : Correspond a ].mp3
Je trie ensuite par rapport a $7 et $5.
Voici le script de lami20j qui trie des images par les valeurs des resolutions et par l'annee (et qui fonctionne bien).
#!/usr/bin/perl
while(<DATA>){
/.*:\d+\s+(.*)\[(\d+)x(\d+)\](\d{4})\..*/;
chomp;
push @nontrie,[$_,$2,$3,$4];
}
@trie = map {$_->[0] }
sort {
$a->[1] <=> $b->[1]
||
$a->[2] <=> $b->[2]
||
$a->[3] <=> $b->[3]
} @nontrie;
print "$_\n" for @trie;
__END__
-rwxrwx--- 1 53460 2007-10-07 02:29 600px-V838_Mon_HST[600x600]1999.jpg
-rwxrwx--- 1 53460 2007-10-07 02:29 abc[600x600]1999.jpg
-rwxrwx--- 1 53460 2007-10-07 02:29 abc[600x600]1997.jpg
-rwxrwx--- 1 53460 2007-10-07 02:29 Abc[600x600]1997.jpg
-rwxrwx--- 1 53460 2007-10-07 02:29 acb[600x600]1997.jpg
-rwxrwx--- 1 53460 2007-10-07 02:29 A00px-V838_Mon_HST[600x600]1999.jpg
-rwxrwx--- 1 69991 2007-10-07 02:27 739px-Omega_Nebula[739x600]1996.jpg
-rwxrwx--- 1 37021 2007-10-07 02:26 NGC2080[600x601]1998.jpg
-rwxrwx--- 1 138525 2007-10-07 02:25 603px-Crab_Nebula[603x600]1997.jpg
-rwxrwx--- 1 525752 2007-10-07 02:24 ESO97-13[1280x1280]1999.jpg
-rwxrwx--- 1 88098 2007-10-07 02:24 600px-ESO97-13[600x600]1997.jpg
Je ne comprends pas que le mien ne fonctionne pas. Ou est l'erreur? J'ai hate de savoir ce qui fait defaut!
Merci, :-)
Salut,
je n'ai pas le temps de regarder ce soir.
en revanche tu peux faire un print sur tes variables pour voir ce que tu obtiens, ainsi tu pourras peut être trouver l'erreur
Pour répondre à lami20j, mon but n'est pas d'en apprendre autant qu'un administrateur de réseaux Linux/Unix
Je n'ai rien dit moi ;-)
je n'ai pas le temps de regarder ce soir.
en revanche tu peux faire un print sur tes variables pour voir ce que tu obtiens, ainsi tu pourras peut être trouver l'erreur
#!/usr/bin/perl while(<DATA>){ /^-(.*):\d{2}(\w)_(\w{3})_(\w*)\[(\d{4})\]-(\w*)-\[(\d{3})\]\.mp3$/; print "\$2=$2,\$3=$3,\$4=$4,\$5=$5,\$6=$6,\$7=$7"; }
Pour répondre à lami20j, mon but n'est pas d'en apprendre autant qu'un administrateur de réseaux Linux/Unix
Je n'ai rien dit moi ;-)
Eh bien lami20j, je viens d'essayer ton petit truc et j'ai ete quand meme satisfait du resultat. Toutes les variables sont bel et bien assignees aux parametres que je voulais.
Je suis donc content de ne pas avoir fait d'erreurs de ce cote. J'ai modifie ta ligne en ajoutant des sauts de ligne /n pour que ce soit plus lisible.
Le seul probleme c'est que ca ne trie pas!!! Ca devient donc encore plus mysterieux car je croyais avoir fait une erreur dans l'assignation des variables, ce qui n'est pas le cas. Et le tri, je le fais selon la procedure que tu as utilisee.
Prends ton temps, je vais attendre.
Salutations, :-)
Je suis donc content de ne pas avoir fait d'erreurs de ce cote. J'ai modifie ta ligne en ajoutant des sauts de ligne /n pour que ce soit plus lisible.
Le seul probleme c'est que ca ne trie pas!!! Ca devient donc encore plus mysterieux car je croyais avoir fait une erreur dans l'assignation des variables, ce qui n'est pas le cas. Et le tri, je le fais selon la procedure que tu as utilisee.
Prends ton temps, je vais attendre.
Salutations, :-)
Salut,
2 erreurs dans ton script
1. dans ton fichier entre l'heure et le 1er caractère qui est e il y a au moins un espace et on ne le vois pas dans ta regex
(
j'ai ete quand meme satisfait du resultat. Toutes les variables sont bel et bien assignees aux parametres que je voulais.
ça m'ettonne que tu vois tes variables, puisque moi j'ai ça
2. tu as oublié que les indices du tableau commencent à 0 et pas à 1
allez on va compter
donc le champ 7 est le 6ème élément et le 5 champ est le 4ème
ce qui donne
Voici ton script entier
Et voici ma version avec le résultat pour ton script (il faut eviter d'écrire une regex longue et très explicite quand nous n'avons pas besoin ;-)) Apprends à être paresseux (c'est une qualité pour les perliens et pas un défaut ;-DD
Nous ne sommes pas obligé de capturer tous les sous-motifs, ça consomme de texte et si on a beaucoup des lignes à traiter alors le programme peut perdre en performances.
Pense à utiliser (?: ) pour ne pas capturer ce que tu n'as pas besoin ou tout simplement de ne pas utiliser des paranthèses (et c'est ton cas)
En fait les paranthèses on les utilise par exemple quand on veut capturer ou quand il y a des alternatives à faire (motif1|motif2), mais jamais juste pour entourer des motifs.
Si le terme d'alternative je ne veux pas le capturer, c'est ici qu'intervies (?:motif1|motif2). Donc je peux regrouper sans capture.
Dans ton cas on peux les enlever pouisqu'il n'y a pas d'alternative et pas non plus de capture.
Ce qui donne en ton cas
2 erreurs dans ton script
1. dans ton fichier entre l'heure et le 1er caractère qui est e il y a au moins un espace et on ne le vois pas dans ta regex
(
j'ai ete quand meme satisfait du resultat. Toutes les variables sont bel et bien assignees aux parametres que je voulais.
ça m'ettonne que tu vois tes variables, puisque moi j'ai ça
lami20j@debian:~/trash$ cat ccm.pl #!/usr/bin/perl # while(<DATA>){ /^-(.*):\d{2}(\w)_(\w{3})_(\w*)\[(\d{4})\]-(\w*)-\[(\d{3})\]\.mp3$/; print "\$2=$2,\$3=$3,\$4=$4,\$5=$5,\$6=$6,\$7=$7\n"; } __END__ -r-xr-xr-x 1 1977910 2002-04-01 15:43 e_can_heart[1976]-dreamboat_annie-[128].mp3 -r-xr-xr-x 1 5538881 2006-04-14 22:02 e_gbr_eno_brian[1975]-mother_whale_eyeless-[128].mp3 -r-xr-xr-x 1 5794058 2006-03-25 06:01 e_gbr_king_crimson[1970]-cadence_and_cascade-[166].mp3 -r-xr-xr-x 1 2428835 2007-08-04 03:05 e_gbr_peter_and_gordon[1965]-everyones_gone_to_the_moon-[128].mp3 -r-xr-xr-x 1 4304271 2006-04-02 00:36 e_gbr_sweet[1974]-restless-[132].mp3 lami20j@debian:~/trash$ perl ccm.pl $2=,$3=,$4=,$5=,$6=,$7= $2=,$3=,$4=,$5=,$6=,$7= $2=,$3=,$4=,$5=,$6=,$7= $2=,$3=,$4=,$5=,$6=,$7= $2=,$3=,$4=,$5=,$6=,$7=revenons à ton script
-r-xr-xr-x 1 1977910 2002-04-01 15:43 e_can_heart[1976]-dreamboat_annie-[128].mp3ce qui fait que ta regerx devra être (voir en gras)
/^-(.*):\d{2}\s*(\w)_(\w{3})_(\w*)\[(\d{4})\]-(\w*)-\[(\d{3})\]\.mp3$/;au lieu de ce que tu as mis
/^-(.*):\d{2}(\w)_(\w{3})_(\w*)\[(\d{4})\]-(\w*)-\[(\d{3})\]\.mp3$/;
2. tu as oublié que les indices du tableau commencent à 0 et pas à 1
allez on va compter
@nontrie,[$_,$2,$3,$4,$5,$6,$7]; 0 - $_ 1 - $2 2 - $3 3 - $4 4 - $5 5 - $6 6 - $7
donc le champ 7 est le 6ème élément et le 5 champ est le 4ème
ce qui donne
@trie = map {$_->[0] } sort { $a->[6] <=> $b->[6] || $a->[4] <=> $b->[4]} @nontrie;
Voici ton script entier
lami20j@debian:~/trash$ cat ccm.pl #!/usr/bin/perl while(<DATA>){ chomp; /^-(.*):\d{2}\s*(\w)_(\w{3})_(\w*)\[(\d{4})\]-(\w*)-\[(\d{3})\]\.mp3$/; push @nontrie,[$_,$2,$3,$4,$5,$6,$7]; } @trie = map {$_->[0] } sort { $a->[6] <=> $b->[6] || $a->[4] <=> $b->[4]} @nontrie; print "$_\n" for @trie; __END__ -r-xr-xr-x 1 1977910 2002-04-01 15:43 e_can_heart[1976]-dreamboat_annie-[128].mp3 -r-xr-xr-x 1 5538881 2006-04-14 22:02 e_gbr_eno_brian[1975]-mother_whale_eyeless-[128].mp3 -r-xr-xr-x 1 5794058 2006-03-25 06:01 e_gbr_king_crimson[1970]-cadence_and_cascade-[166].mp3 -r-xr-xr-x 1 2428835 2007-08-04 03:05 e_gbr_peter_and_gordon[1965]-everyones_gone_to_the_moon-[128].mp3 -r-xr-xr-x 1 4304271 2006-04-02 00:36 e_gbr_sweet[1974]-restless-[132].mp3et le résultat
lami20j@debian:~/trash$ perl ccm.pl -r-xr-xr-x 1 2428835 2007-08-04 03:05 e_gbr_peter_and_gordon[1965]-everyones_gone_to_the_moon-[128].mp3 -r-xr-xr-x 1 5538881 2006-04-14 22:02 e_gbr_eno_brian[1975]-mother_whale_eyeless-[128].mp3 -r-xr-xr-x 1 1977910 2002-04-01 15:43 e_can_heart[1976]-dreamboat_annie-[128].mp3 -r-xr-xr-x 1 4304271 2006-04-02 00:36 e_gbr_sweet[1974]-restless-[132].mp3 -r-xr-xr-x 1 5794058 2006-03-25 06:01 e_gbr_king_crimson[1970]-cadence_and_cascade-[166].mp3
Et voici ma version avec le résultat pour ton script (il faut eviter d'écrire une regex longue et très explicite quand nous n'avons pas besoin ;-)) Apprends à être paresseux (c'est une qualité pour les perliens et pas un défaut ;-DD
lami20j@debian:~/trash$ cat artagon.pl #!/usr/bin/perl while(<DATA>){ chomp; /.*(\d{4}).*(\d{3}).*\.mp3/; push @nontrie,[$_,$1,$2]; } @trie = map {$_->[0] } sort { $a->[2] <=> $b->[2] || $a->[1] <=> $b->[1]} @nontrie; print "$_\n" for @trie; __END__ -r-xr-xr-x 1 1977910 2002-04-01 15:43 e_can_heart[1976]-dreamboat_annie-[128].mp3 -r-xr-xr-x 1 5538881 2006-04-14 22:02 e_gbr_eno_brian[1975]-mother_whale_eyeless-[128].mp3 -r-xr-xr-x 1 5794058 2006-03-25 06:01 e_gbr_king_crimson[1970]-cadence_and_cascade-[166].mp3 -r-xr-xr-x 1 2428835 2007-08-04 03:05 e_gbr_peter_and_gordon[1965]-everyones_gone_to_the_moon-[128].mp3 -r-xr-xr-x 1 4304271 2006-04-02 00:36 e_gbr_sweet[1974]-restless-[132].mp3 lami20j@debian:~/trash$ perl artagon.pl -r-xr-xr-x 1 2428835 2007-08-04 03:05 e_gbr_peter_and_gordon[1965]-everyones_gone_to_the_moon-[128].mp3 -r-xr-xr-x 1 5538881 2006-04-14 22:02 e_gbr_eno_brian[1975]-mother_whale_eyeless-[128].mp3 -r-xr-xr-x 1 1977910 2002-04-01 15:43 e_can_heart[1976]-dreamboat_annie-[128].mp3 -r-xr-xr-x 1 4304271 2006-04-02 00:36 e_gbr_sweet[1974]-restless-[132].mp3 -r-xr-xr-x 1 5794058 2006-03-25 06:01 e_gbr_king_crimson[1970]-cadence_and_cascade-[166].mp3
Nous ne sommes pas obligé de capturer tous les sous-motifs, ça consomme de texte et si on a beaucoup des lignes à traiter alors le programme peut perdre en performances.
Pense à utiliser (?: ) pour ne pas capturer ce que tu n'as pas besoin ou tout simplement de ne pas utiliser des paranthèses (et c'est ton cas)
En fait les paranthèses on les utilise par exemple quand on veut capturer ou quand il y a des alternatives à faire (motif1|motif2), mais jamais juste pour entourer des motifs.
Si le terme d'alternative je ne veux pas le capturer, c'est ici qu'intervies (?:motif1|motif2). Donc je peux regrouper sans capture.
Dans ton cas on peux les enlever pouisqu'il n'y a pas d'alternative et pas non plus de capture.
Ce qui donne en ton cas
lami20j@debian:~/trash$ cat ccm.pl #!/usr/bin/perl while(<DATA>){ chomp; /^-.*:\d{2}\s*\w_\w{3}_\w*\[(\d{4})\]-\w*-\[(\d{3})\]\.mp3$/; push @nontrie,[$_,$1,$2]; } @trie = map {$_->[0] } sort { $a->[2] <=> $b->[2] || $a->[1] <=> $b->[1]} @nontrie; print "$_\n" for @trie; __END__ -r-xr-xr-x 1 1977910 2002-04-01 15:43 e_can_heart[1976]-dreamboat_annie-[128].mp3 -r-xr-xr-x 1 5538881 2006-04-14 22:02 e_gbr_eno_brian[1975]-mother_whale_eyeless-[128].mp3 -r-xr-xr-x 1 5794058 2006-03-25 06:01 e_gbr_king_crimson[1970]-cadence_and_cascade-[166].mp3 -r-xr-xr-x 1 2428835 2007-08-04 03:05 e_gbr_peter_and_gordon[1965]-everyones_gone_to_the_moon-[128].mp3 -r-xr-xr-x 1 4304271 2006-04-02 00:36 e_gbr_sweet[1974]-restless-[132].mp3 lami20j@debian:~/trash$ perl ccm.pl -r-xr-xr-x 1 2428835 2007-08-04 03:05 e_gbr_peter_and_gordon[1965]-everyones_gone_to_the_moon-[128].mp3 -r-xr-xr-x 1 5538881 2006-04-14 22:02 e_gbr_eno_brian[1975]-mother_whale_eyeless-[128].mp3 -r-xr-xr-x 1 1977910 2002-04-01 15:43 e_can_heart[1976]-dreamboat_annie-[128].mp3 -r-xr-xr-x 1 4304271 2006-04-02 00:36 e_gbr_sweet[1974]-restless-[132].mp3 -r-xr-xr-x 1 5794058 2006-03-25 06:01 e_gbr_king_crimson[1970]-cadence_and_cascade-[166].mp3
Salut lami20j,
Concernant la première erreur (l'espacement), j'ai fait une erreur dans le message #7. Je n'ai pas ajouté le terme \s dans mon script mais je l'ai ajouté dans l'explication que j'ai donnée!
Quand, j'ai fait ton test d'affichage des variables hier, j'ai pris mon script dans lequel j'avais deja ajoute le terme \s et non ton script d'essai (voir plus bas). C'est la raison pour laquelle j'ai pu voir mes variables.
“Ton” script test n'affiche pas les variables parce que tu as copié/collé directement mon script dans lequel il manque \s.
Remarque : Toi tu mets \s* mais on peut mettre que \s car il n'y a qu'un seul espacement.
Donc, si tu rajoutes \s (en gras) dans le script test suivant, ca affiche les variables.
#!/usr/bin/perl
while(<DATA>){
/^-(.*):\d{2}\s(\w)_(\w{3})_(\w*)\[(\d{4})\]-(\w*)-\[(\d{3})\]\.mp3$/;
print "\$2=$2,\$3=$3,\$4=$4,\$5=$5,\$6=$6,\$7=$7\n"; }
__END__
-r-xr-xr-x 1 1977910 2002-04-01 15:43 e_can_heart[1976]-dreamboat_annie-[128].mp3
-r-xr-xr-x 1 5538881 2006-04-14 22:02 e_gbr_eno_brian[1975]-mother_whale_eyeless-[128].mp3
-r-xr-xr-x 1 5794058 2006-03-25 06:01 e_gbr_king_crimson[1970]-cadence_and_cascade-[166].mp3
-r-xr-xr-x 1 2428835 2007-08-04 03:05 e_gbr_peter_and_gordon[1965]-everyones_gone_to_the_moon-[128].mp3
-r-xr-xr-x 1 4304271 2006-04-02 00:36 e_gbr_sweet[1974]-restless-[132].mp3
Concernant la capture des motifs dont tu parles, c'est une bonne remarque. Je savais que je ne suis pas obligé de tous les prendre. C'est simplement parce que, dans mon cas, ce script est juste une ébauche d'un script plus général qui va me permettre de choisir les critères de tri au moyen d'un menu que je vais faire afficher à l'écran.
Par exemple : Choix 1) Artiste et taux d'échantillonnage
2) Artiste et année
3) 4) etc ...
Je dois donc, dans cette optique, capturer toutes mes variables et les garder.
Donc le script que je garderai est le suivant (general) :
#!/usr/bin/perl
while(<DATA>){
chomp;
/^-(.*):\d{2}\s(\w)_(\w{3})_(\w*)\[(\d{4})\]-(\w*)-\[(\d{3})\]\.mp3$/;
push @nontrie,[$_,$2,$3,$4,$5,$6,$7];
} @trie = map {$_->[0] }
sort { $a->[6] <=> $b->[6] || $a->[4] <=> $b->[4]} @nontrie;
print "$_\n" for @trie;
__END__
-r-xr-xr-x 1 1977910 2002-04-01 15:43 e_can_heart[1976]-dreamboat_annie-[128].mp3
-r-xr-xr-x 1 5538881 2006-04-14 22:02 e_gbr_eno_brian[1975]-mother_whale_eyeless-[128].mp3
-r-xr-xr-x 1 5794058 2006-03-25 06:01 e_gbr_king_crimson[1970]-cadence_and_cascade-[166].mp3
-r-xr-xr-x 1 2428835 2007-08-04 03:05 e_gbr_peter_and_gordon[1965]-everyones_gone_to_the_moon-[128].mp3
-r-xr-xr-x 1 4304271 2006-04-02 00:36 e_gbr_sweet[1974]-restless-[132].mp3
Donc RESOLU!
Merci beaucoup lami20j, :-))
Concernant la première erreur (l'espacement), j'ai fait une erreur dans le message #7. Je n'ai pas ajouté le terme \s dans mon script mais je l'ai ajouté dans l'explication que j'ai donnée!
Quand, j'ai fait ton test d'affichage des variables hier, j'ai pris mon script dans lequel j'avais deja ajoute le terme \s et non ton script d'essai (voir plus bas). C'est la raison pour laquelle j'ai pu voir mes variables.
“Ton” script test n'affiche pas les variables parce que tu as copié/collé directement mon script dans lequel il manque \s.
Remarque : Toi tu mets \s* mais on peut mettre que \s car il n'y a qu'un seul espacement.
Donc, si tu rajoutes \s (en gras) dans le script test suivant, ca affiche les variables.
#!/usr/bin/perl
while(<DATA>){
/^-(.*):\d{2}\s(\w)_(\w{3})_(\w*)\[(\d{4})\]-(\w*)-\[(\d{3})\]\.mp3$/;
print "\$2=$2,\$3=$3,\$4=$4,\$5=$5,\$6=$6,\$7=$7\n"; }
__END__
-r-xr-xr-x 1 1977910 2002-04-01 15:43 e_can_heart[1976]-dreamboat_annie-[128].mp3
-r-xr-xr-x 1 5538881 2006-04-14 22:02 e_gbr_eno_brian[1975]-mother_whale_eyeless-[128].mp3
-r-xr-xr-x 1 5794058 2006-03-25 06:01 e_gbr_king_crimson[1970]-cadence_and_cascade-[166].mp3
-r-xr-xr-x 1 2428835 2007-08-04 03:05 e_gbr_peter_and_gordon[1965]-everyones_gone_to_the_moon-[128].mp3
-r-xr-xr-x 1 4304271 2006-04-02 00:36 e_gbr_sweet[1974]-restless-[132].mp3
Concernant la capture des motifs dont tu parles, c'est une bonne remarque. Je savais que je ne suis pas obligé de tous les prendre. C'est simplement parce que, dans mon cas, ce script est juste une ébauche d'un script plus général qui va me permettre de choisir les critères de tri au moyen d'un menu que je vais faire afficher à l'écran.
Par exemple : Choix 1) Artiste et taux d'échantillonnage
2) Artiste et année
3) 4) etc ...
Je dois donc, dans cette optique, capturer toutes mes variables et les garder.
Donc le script que je garderai est le suivant (general) :
#!/usr/bin/perl
while(<DATA>){
chomp;
/^-(.*):\d{2}\s(\w)_(\w{3})_(\w*)\[(\d{4})\]-(\w*)-\[(\d{3})\]\.mp3$/;
push @nontrie,[$_,$2,$3,$4,$5,$6,$7];
} @trie = map {$_->[0] }
sort { $a->[6] <=> $b->[6] || $a->[4] <=> $b->[4]} @nontrie;
print "$_\n" for @trie;
__END__
-r-xr-xr-x 1 1977910 2002-04-01 15:43 e_can_heart[1976]-dreamboat_annie-[128].mp3
-r-xr-xr-x 1 5538881 2006-04-14 22:02 e_gbr_eno_brian[1975]-mother_whale_eyeless-[128].mp3
-r-xr-xr-x 1 5794058 2006-03-25 06:01 e_gbr_king_crimson[1970]-cadence_and_cascade-[166].mp3
-r-xr-xr-x 1 2428835 2007-08-04 03:05 e_gbr_peter_and_gordon[1965]-everyones_gone_to_the_moon-[128].mp3
-r-xr-xr-x 1 4304271 2006-04-02 00:36 e_gbr_sweet[1974]-restless-[132].mp3
Donc RESOLU!
Merci beaucoup lami20j, :-))
Salut,
“Ton” script test n'affiche pas les variables parce que tu as copié/collé directement mon script dans lequel il manque \s.
Je ne pouvais pas le savoir ;-))
Remarque : Toi tu mets \s* mais on peut mettre que \s car il n'y a qu'un seul espacement.
Donc, si tu rajoutes \s (en gras) dans le script test suivant, ca affiche les variables.
On n'est jamais sur, à mettre un quantificateur par précaution, n'est pas si mauvais ;-))
Bonne continuation ;-)
“Ton” script test n'affiche pas les variables parce que tu as copié/collé directement mon script dans lequel il manque \s.
Je ne pouvais pas le savoir ;-))
Remarque : Toi tu mets \s* mais on peut mettre que \s car il n'y a qu'un seul espacement.
Donc, si tu rajoutes \s (en gras) dans le script test suivant, ca affiche les variables.
On n'est jamais sur, à mettre un quantificateur par précaution, n'est pas si mauvais ;-))
Bonne continuation ;-)