View previous topic :: View next topic |
Author |
Message |
razer l33t
Joined: 08 Oct 2004 Posts: 893 Location: Paris - France
|
Posted: Sat Mar 01, 2008 8:07 am Post subject: [perl] valeur d'une variable dans un pattern type (résolu) |
|
|
Bonjour,
Je ne sais pas si mon titre est clair : j'essaye d'insérer une variable dans un pattern m/PATTERN/, et je n'y arrive pas. J'imagine que la logique de mon algo est pas pas bonne, donc je le soumet à vos critiques.
Je souhaite faire un script qui permette à mplayer de lire un DVD contenu dans un fichier iso, et qu'il choisisse automatiquement le bon titre sans que je m'emm... dans les menus .
Je commence par monter un loopback de l'iso, puis j'identifie le film :
Code: | #Identification du fichier
$ident=`mplayer -channels 6 -quiet -identify -vo null -ao null -frames 1 dvd://1 -dvd-device /tmp/isoloop/VIDEO_TS`;
@data = split ("\n", $ident);
foreach (@data) {
($temp,$nbtitles) = split ("=", $_) if $_ =~ m/ID_DVD_TITLES/;
($temp,$width) = split ("=", $_) if $_ =~ m/ID_VIDEO_WIDTH/;
($temp,$height) = split ("=", $_) if $_ =~ m/ID_VIDEO_HEIGHT/;
($temp,$vaspect) = split ("=", $_) if $_ =~ m/ID_VIDEO_ASPECT/;
($temp,$channels) = split ("=", $_) if $_ =~ m/ID_AUDIO_NCH/;
($temp,$vcodec) = split ("=", $_) if $_ =~ m/ID_VIDEO_CODEC/;
} |
$nbtitles me donne alors la quantité de titres présents. Mon idée est que mplayer lise le titre le plus long, il y a fort à parier que ce sera alors le film.
L'identification me renvoie aussi des données ID_DVD_TITLE_<N° du titre>_LENGTH, je dois donc les comparer entre elles :
Code: | $ref_length = 0;
for ($i=1; $i < $nbtitles+1; $i++) {
foreach (@data) {
($temp,$length) = split ("=", $_) if $_ =~ m/ID_DVD_TITLE_$i_LENGTH/o;
}
printf "LA LONGUEUR DU TITRE $i est $length\n";
if ($length >= $ref_length) {
$ref_length == $length;
$title = $i;
}
} |
Et bien entendu cela fonctionne pas...
J'ai parfois l'impression de prendre le problème à l'envers, ou tout du moins pas dans le bon angle...
Des idées ?
Merci
Last edited by razer on Wed Mar 05, 2008 12:46 pm; edited 1 time in total |
|
Back to top |
|
|
Bob_Le_Mou Tux's lil' helper
Joined: 17 Jun 2004 Posts: 114 Location: Pantin, France
|
Posted: Mon Mar 03, 2008 10:10 am Post subject: |
|
|
Bonjour,
Vite fait, voici la manière dont je réécrirai ce bout de code :
Code: |
$ref_length = 0;
for ($i=1; $i < $nbtitles+1; $i++) {
my $str="ID_DVD_TITLE_".$i."_LENGTH"; # construction de la chaine
my $reg=qr!$str!; #compilation de l'expression regulière
foreach (@data) {
($temp,$length) = split ("=", $_) if $_ =~ /$reg/;
}
printf "LA LONGUEUR DU TITRE $i est $length\n";
if ($length >= $ref_length) {
$ref_length = $length;
$title = $i;
}
}
|
Peut être quelqu'un aura une solution plus élégante.
/edit
modification du code pour être plus proche de l'original.
edit/
B. _________________ Rimouski, c'est loin-in d'ici... |
|
Back to top |
|
|
razer l33t
Joined: 08 Oct 2004 Posts: 893 Location: Paris - France
|
Posted: Tue Mar 04, 2008 7:21 pm Post subject: |
|
|
Je vais essayer çà, merci...
Je serais aussi intéressé par une explication concernant la compilation de l'expression regulière , ie un lien de perldoc s'y référant. Merci bcp |
|
Back to top |
|
|
Bob_Le_Mou Tux's lil' helper
Joined: 17 Jun 2004 Posts: 114 Location: Pantin, France
|
Posted: Tue Mar 04, 2008 10:01 pm Post subject: |
|
|
Bien sûr :
et chercher le paragraphe : "Compiling and saving regular expressions"
ou bien sur le net .
Pour les programmeurs perl, je ne serai pas totalement exhaustif sans conseiller la lecture de l'excellent camel book (1000p) notamment le chapitre 5 sur la "recherche de motif".
B. _________________ Rimouski, c'est loin-in d'ici... |
|
Back to top |
|
|
marvin rouge Veteran
Joined: 01 Aug 2004 Posts: 1422 Location: Villa Lumierrante, Zonelibre
|
Posted: Wed Mar 05, 2008 10:26 am Post subject: |
|
|
Je ne suis pas sûr d'avoir bien compris tout ce que tu veux faire, mais si c'est uniquement pour trouver le titre dont la longueur est maximale, il y a possibilité de simplifier.
Voilà comment je ferai (but there's more than one way to do it, comme on dit):
Code: |
use strict;
my $command = `mplayer -channels 6 -quiet -identify -vo null -ao null -frames 1 dvd://1 -dvd-device /mnt/cdrom/video_ts/`;
my @data = split ("\n", $command);
my $reflength = 0;
foreach (@data) {
if ($_ =~ /ID_DVD_TITLE_(\d+)_LENGTH\s*=\s*(.*)/) {
print "Titre : $1 => longueur : $2\n";
$reflength = $2 if ($2 > $reflength);
}
}
|
La différence avec la solution proposée ci-dessus, c'est que tu n'a pas besoin de construire une chaine de pattern qui soit "exacte" : tu peux utiliser les classes de caractères.
- Ici, le \d+ te permet de reconnaitre un ou plusieurs caractères numériques. La mise entre parenthèse permet de le capturer dans la variable (locale) $1.
- le (.*) permet de capturer la longueur dans la variable $2
Et à la fin, dans $reflength, tu as ta longueur maximale.
Et je plussoie le Camel Book, vraiment une référence.
+ |
|
Back to top |
|
|
razer l33t
Joined: 08 Oct 2004 Posts: 893 Location: Paris - France
|
Posted: Wed Mar 05, 2008 12:45 pm Post subject: |
|
|
Merci marvin rouge pour ta contribution, cependant à mon niveau je préfère faire du code plus long, mais aussi plus facile à relire. C'est p'tet une erreur, mais bon...
Et merci Bob_Le_Mou pour tes liens de doc.
Je n'ai pas encore pris le temps de tester, je mets résolu au thread, je le ressortirais le cas échéant... |
|
Back to top |
|
|
Bob_Le_Mou Tux's lil' helper
Joined: 17 Jun 2004 Posts: 114 Location: Pantin, France
|
Posted: Wed Mar 05, 2008 11:09 pm Post subject: |
|
|
A vrai dire, la solution de marvin rouge est bien plus compacte et plus "perlienne" que la mienne, c'est à dire élégante, c'est bien dans l'esprit "TIMTOWDI".
L'idée était aussi de te montrer que les expressions régulières sont vraiment très bien intégrées dans perl, les exemples de la docs sont particulièrement intéressant à voir.
B. _________________ Rimouski, c'est loin-in d'ici... |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|