[PERL] Nom de variable composé

Nom de variable composé [PERL] - Perl - Programmation

Marsh Posté le 19-12-2011 à 16:03:11    

Bonjour,  :hello:  
 
Je suis en train de faire un test pour utiliser des noms de variables composé (comme en PHP par exemple).
 
Pour tester, j'ai fais ce petit test.

Code :
  1. #!/usr/bin/perl -w
  2. no strict 'vars';
  3. my $aaabbb="Hello !";
  4. my $test1="aaa";
  5. my $test2="bbb";
  6. print "$aaabbb \n";
  7. print "${aaabbb}\n";
  8. print "${aaa.$test2}\n";
  9. print "${$test1.bbb}\n";
  10. print "${'aaa'.$test2}\n";
  11. print "${$test1.'bbb'}\n";
  12. print "${$test1.$test2}\n";


 
Je suis surpris de voir que malgré l'utilisation du "no strict 'vars'", a part les deux premiers exemples, aucun ne fonctionne.
L'utilisation de variables composées est elle possible en perl?  :??:


Message édité par Super_carotte le 19-12-2011 à 16:53:08
Reply

Marsh Posté le 19-12-2011 à 16:03:11   

Reply

Marsh Posté le 19-12-2011 à 23:21:51    

Pour autant que je sache, non.
 
print eval "\$${test1}${test2}"; marche, mais ce n'est pas vraiment une variable composée.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 20-12-2011 à 11:28:50    

Hmmm.. c'est problématique.
En fait, j'ai une fonction qui s'appelle elle même. (CF ci-dessous)
 
Et j'aurai besoin de créer une variable qui a un nom différent a chaque fois.
 
C'est la variable "$pm2" qui doit changer de nom a chaque fois.
Auriez vous une idée pour arriver à faire ça sans utiliser de nom de variable composé?
 

Code :
  1. sub launch_process
  2. {
  3.  my $pm2 = new Parallel::ForkManager(10);
  4.  my(@args) = @_;
  5.  my $ID_inLaunch=$args[0];
  6.  my $RETOUR_inLaunch ="";
  7.  foreach my $row_inFork (@tabProc)
  8.  {
  9.   if ($row_inFork->{ID_PROCESS} == $ID_inLaunch )
  10.   {
  11.    my $LOCK_inLaunch = $row_inFork->{LOCK};
  12.    my $TYPE_inLaunch = $row_inFork->{TYPE};
  13.    my $FILS_inLaunch = $row_inFork->{FILS};
  14.    my $PERE_inLaunch = $row_inFork->{PERE};
  15.    my @tab1 = split(/ /,$PERE_inLaunch);
  16.    my $tailletab1 = scalar @tab1;
  17.    my @tab2=@tabProcFini;
  18.    my %hash = map{$_ => 1} (@tab1, @tab2);
  19.    my @tab = keys %hash;
  20.    my $nombre_elements_commun = @tab1 + @tab2 - @tab;
  21.    if($nombre_elements_commun == $tailletab1)
  22.    {
  23.     if ($LOCK_inLaunch == "0" ) #si le processus est bloqué (dans ce test code, il ne l'est jamais)
  24.     {
  25.      $RETOUR_inLaunch = "Not OK";
  26.      if ($RETOUR_inLaunch eq "OK" ) #si le retout est OK (dans ce test code, il ne l'est jamais)
  27.      {
  28.       print "tabProcFini : @tabProcFini\n";
  29.       print "PROCESS","$ID_inLaunch is Running \n";
  30.       (tied @tabProcFini)->shlock;
  31.        push(@tabProcFini,$ID_inLaunch);  #j'ajoute le processus dans le tableau des processus fini
  32.       (tied @tabProcFini)->shunlock;
  33.       print "\n";
  34.      }
  35.      else
  36.      {
  37.      print "ID_inLaunch $ID_inLaunch\n";
  38.       sleep 2;
  39.       (tied @tabProcFini)->shlock;
  40.        push(@tabProcFini,$ID_inLaunch);  #j'ajoute le processus dans le tableau des processus fini
  41.       (tied @tabProcFini)->shunlock;
  42.       if ($FILS_inLaunch ne "NULL" )
  43.       {
  44.        my @tabFils_inLaunch = split(/ /,$FILS_inLaunch);
  45.        foreach my $row_fils_inLaunch (@tabFils_inLaunch)  #pour chaque processus
  46.        {
  47.        print "row_fils_inLaunch $row_fils_inLaunch\n";
  48.         $pm2->start and next; # je lance un fork
  49.          launch_process($row_fils_inLaunch);
  50.         $pm2->finish;
  51.        }
  52.       }
  53.      }
  54.     }
  55.     else
  56.     {
  57.      print "PROCESS","$ID_inLaunch is Locked !!! \n";
  58.      push(@tabProcFini,$ID_inLaunch);
  59.      print "\n";
  60.     }
  61.    }
  62.   }
  63.  }
  64. }


 
Merci,
Cordialement,
Benjamin


Message édité par Super_carotte le 20-12-2011 à 12:04:27
Reply

Marsh Posté le 20-12-2011 à 12:12:13    

Je pense avoir réussi en faisant ainsi:
no strict 'refs';
my $ID_inLaunch = #ce que me donne la fonction en entrée
my $varname = "pm$ID_inLaunch";  
$$varname = new Parallel::ForkManager(10);  
 
Et donc, je l'utilise comme ceci:
$$varname->start and next; # je lance un fork      
launch_process($row_fils_inLaunch);      
$$varname->finish;
 
 :D
 
Merci Gilou !  ;)


Message édité par Super_carotte le 20-12-2011 à 12:22:59
Reply

Marsh Posté le 20-12-2011 à 12:36:46    

La solution Perl habituelle, ce serait de faire un hash et d'associer a la clé de valeur $ID_inLaunch la valeur de new Parallel::ForkManager(10);
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

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