Utiliser une variable d'un script dans un autre script

Utiliser une variable d'un script dans un autre script - Perl - Programmation

Marsh Posté le 24-07-2006 à 12:05:14    

Bonjour tout le monde.Je suis débutant en perl, et je suis confronté à un problème que mes différentes recherches n'ont pas résolu.
Voila, je souhaiterais savoir comment on peut utiliser dans un script une variable utilisée dans le script  précédent. Je vous fais suivre mes deux scripts :

 

secret.pl :

Code :
  1. #!/usr/bin/perl
  2. use DBI;
  3. use Asterisk::AGI;
  4. use strict;
  5. my $AGI = new Asterisk::AGI;
  6. my %input = $AGI->ReadParse();
  7. $AGI->exec('Playback','/usr/share/asterisk/sounds/fr/vm-login');
  8. my ($num) = $AGI->get_data('/usr/share/asterisk/sounds/beep',2000,2);
  9. my $dbh = DBI->connect("DBI:mysql:asterisk","*****","*****" );
  10. my $verif = $dbh->prepare("select num from messages where num=$num" );
  11. $verif -> execute();
  12. if ($num = $verif ->fetchrow)
  13.         {
  14.                 my $mess = $dbh->prepare("select message from messages where num=$num" );
  15.                 $mess -> execute();
  16.                 my $message = $mess->fetchrow;
  17.                 $AGI -> verbose("modification de $mess\n",1);
  18.                 $AGI -> verbose("modification de $message\n",1);
  19.                 $AGI -> exec('Playback',"fr/$message" );
  20.                 $AGI -> exec('Playback','fr/dir-instr');
  21.                 $AGI -> set_priority(3);
  22.         }
  23. else
  24.         {
  25.                 $AGI -> exec('Playback','/usr/share/asterisk/sounds/fr/conf-errormenu');
  26.                 $AGI ->set_priority(2);
  27.         }
 

verif_secret.pl :

Code :
  1. #!/usr/bin/perl
  2. use DBI;
  3. use Asterisk::AGI;
  4. use strict;
  5. my $AGI = new Asterisk::AGI;
  6. my %input = $AGI->ReadParse();
  7. my $verif = $AGI->get_data('beep',2000,1);
  8. if ($verif =~ m/1/)
  9.         {
  10.                 $AGI->exec('Playback','fr/vm-rec-temp');
  11.                 $AGI->exec('Playback','beep');
  12.                 $AGI->exec('Record',"/usr/share/asterisk/sounds/fr/$message:gsm" );
  13.                 $AGI->exec('Wait',2);
  14.                 $AGI->exec('Playback',"/usr/share/asterisk/sounds/fr/$message" );
  15.         }
  16. else
  17.         {
  18.                 $AGI->set_priority(2);
  19.         }


 
J'utilise en fait le module AGI du logiciel Asterisk, mais mon problème vient bien de perl.
Ce que je souhaite faire à l'aide de ces deux scripts, est la modification d'un message vocal.
Pour
cela, la personne appelant selectionne le message par le numero
l'identifiant dans la base de données. On récupère son nom dans '$mess' puis dans '$message'. Le passage à verif_secret.pl
sert à vérifier que ce message est bien celui à modifier, puis à
réenregistrer le message en conservant le même nom, c'est à dire la
chaîne de caractères '$message'. J'ai donc besoin de récupérer cette variable, issue de secret.pl, dans verif_secret.pl.
J'espère avoir été suffisamment clair.
Merci d'avance pour toute aide éventuelle.

Message cité 1 fois
Message édité par duedos le 12-09-2006 à 10:37:27
Reply

Marsh Posté le 24-07-2006 à 12:05:14   

Reply

Marsh Posté le 24-07-2006 à 14:59:00    

Et Dieu inventa le retour chariot.

Reply

Marsh Posté le 25-07-2006 à 10:04:08    

duedos a écrit :

Voila, je souhaiterais savoir comment on peut utiliser dans un script une variable utilisée dans le script  précédent. Je vous fais suivre mes deux scripts :


Il faut pour cela que ton premier script exécute le second en fournissant lors de l'exécution les variables en paramètres.
 
Exemple :
 

Code :
  1. # 1er script devant envoyer en argv $mess et $message au second programme
  2. # en fin de code du 1er script :
  3. system("perl monscript2.pl $mess $message" );
  4. # début du 2è script
  5. my ($mess, $message) = ($ARGV[0], $ARGV[1]);


 
NOTE 1 : la fonction system employée dans mon exemple fait que le script 1 va lancer le script 2 puis reprendra la main lorsque le script 2 se sera terminé. Utilise exec à la place de system si tu veux que le script 1 passe la main au script 2 en s'arrêtant immédiatement.
 
NOTE 2 : autre possibilité, écrire dans un fichier .conf, .ini ou tout ce que tu veux le contenu des variables que tu souhaites utiliser avec le script 2. Ce dernier n'aura qu'à lire ce fichier, en récupérer le contenu et se mettre à bosser.


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

Marsh Posté le 25-07-2006 à 10:16:15    

Je vais essayer dans un premier temps cette première méthode puis j'essaierai la seconde si ca ne marche pas. Si tu pouvais m'expliquer un peu plus en détail comment faire, ce serait très sympa car je ne suis vraiment pas très habile en informatique engénéral et en programmation en particulier.

Reply

Marsh Posté le 25-07-2006 à 10:22:45    

En admettant que tes 2 scripts perl sont localisés au même endroit ET que tu les lances manuellement.
 
secret.pl :

Code :
  1. #!/usr/bin/perl
  2. use DBI;
  3. use Asterisk::AGI;
  4. use strict;
  5. my $AGI = new Asterisk::AGI;
  6. my %input = $AGI->ReadParse();
  7. $AGI->exec('Playback','/usr/share/asterisk/sounds/fr/vm-login');
  8. my ($num) = $AGI->get_data('/usr/share/asterisk/sounds/beep',2000,2);
  9. my $dbh = DBI->connect("DBI:mysql:asterisk","root","czame" );
  10. my $verif = $dbh->prepare("select num from messages where num=$num" );
  11. $verif -> execute();
  12. if ($num = $verif ->fetchrow)
  13.         {
  14.                 my $mess = $dbh->prepare("select message from messages where num=$num" );
  15.                 $mess -> execute();
  16.                 my $message = $mess->fetchrow;
  17.                 $AGI -> verbose("modification de $mess\n",1);
  18.                 $AGI -> verbose("modification de $message\n",1);
  19.                 $AGI -> exec('Playback',"fr/$message" );
  20.                 $AGI -> exec('Playback','fr/dir-instr');
  21.                 $AGI -> set_priority(3);
  22.         }
  23. else
  24.         {
  25.                 $AGI -> exec('Playback','/usr/share/asterisk/sounds/fr/conf-errormenu');
  26.                 $AGI ->set_priority(2);
  27.         }
  28. ########### RAJOUT ##############
  29. open(TRACE, ">message.conf" ) or die("création message.conf erreur : $!\n" );
  30. print TRACE "$mess|$message";
  31. close(TRACE);


 
verif_secret.pl :

Code :
  1. #!/usr/bin/perl
  2. use DBI;
  3. use Asterisk::AGI;
  4. use strict;
  5. ########### RAJOUT ##############
  6. my $mess;
  7. my $message;
  8. open(TRACE, "message.conf" ) or die("lecture message.conf erreur : $!\n" );
  9. $_ = <TRACE>;
  10. close(TRACE);
  11. ($mess, $message) = split(/\\|/, $_);
  12. my $AGI = new Asterisk::AGI;
  13. my %input = $AGI->ReadParse();
  14. my $verif = $AGI->get_data('beep',2000,1);
  15. if ($verif =~ m/1/)
  16.         {
  17.                 $AGI->exec('Playback','fr/vm-rec-temp');
  18.                 $AGI->exec('Playback','beep');
  19.                 $AGI->exec('Record',"/usr/share/asterisk/sounds/fr/$message:gsm" );
  20.                 $AGI->exec('Wait',2);
  21.                 $AGI->exec('Playback',"/usr/share/asterisk/sounds/fr/$message" );
  22.         }
  23. else
  24.         {
  25.                 $AGI->set_priority(2);
  26.         }


 
L'exemple montré est la solution par fichier annexe (solution 2 de mon explication précédente).


Message édité par Aricoh le 25-07-2006 à 10:24:11

---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

Marsh Posté le 25-07-2006 à 11:03:11    

Merci Aricoh, tu es magique. Sans mauvais jeu de mots au passage...
Sans rire, cela faisait un moment que je galérais à cause de ce problème, et maintenant grâce à toi tout fonctionne.
Je ne saurais comment te remercier. Tu as déjà toute ma gratitude.
Merci encore
 :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:


Message édité par duedos le 25-07-2006 à 11:04:00
Reply

Marsh Posté le 25-07-2006 à 11:07:58    

de rien  :jap:


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed