Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[perl] valeur d'une variable dans un pattern type (résolu)
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index French
View previous topic :: View next topic  
Author Message
razer
l33t
l33t


Joined: 08 Oct 2004
Posts: 893
Location: Paris - France

PostPosted: Sat Mar 01, 2008 8:07 am    Post subject: [perl] valeur d'une variable dans un pattern type (résolu) Reply with quote

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
View user's profile Send private message
Bob_Le_Mou
Tux's lil' helper
Tux's lil' helper


Joined: 17 Jun 2004
Posts: 114
Location: Pantin, France

PostPosted: Mon Mar 03, 2008 10:10 am    Post subject: Reply with quote

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
View user's profile Send private message
razer
l33t
l33t


Joined: 08 Oct 2004
Posts: 893
Location: Paris - France

PostPosted: Tue Mar 04, 2008 7:21 pm    Post subject: Reply with quote

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
View user's profile Send private message
Bob_Le_Mou
Tux's lil' helper
Tux's lil' helper


Joined: 17 Jun 2004
Posts: 114
Location: Pantin, France

PostPosted: Tue Mar 04, 2008 10:01 pm    Post subject: Reply with quote

Bien sûr :

Code:
perldoc perlretut


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
View user's profile Send private message
marvin rouge
Veteran
Veteran


Joined: 01 Aug 2004
Posts: 1422
Location: Villa Lumierrante, Zonelibre

PostPosted: Wed Mar 05, 2008 10:26 am    Post subject: Reply with quote

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
View user's profile Send private message
razer
l33t
l33t


Joined: 08 Oct 2004
Posts: 893
Location: Paris - France

PostPosted: Wed Mar 05, 2008 12:45 pm    Post subject: Reply with quote

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
View user's profile Send private message
Bob_Le_Mou
Tux's lil' helper
Tux's lil' helper


Joined: 17 Jun 2004
Posts: 114
Location: Pantin, France

PostPosted: Wed Mar 05, 2008 11:09 pm    Post subject: Reply with quote

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
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index French All times are GMT
Page 1 of 1

 
Jump to:  
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