Forum Programmation.perl Passage d'array dans une subroutine

Posté par (site web personnel, Mastodon) . Licence CC By‐SA.
Étiquettes :
1
24
fév.
2013

Bonjour tout le monde !

J'aurais besoin d'un coup de main pour comprendre pourquoi mon test perl fonctionne ainsi :

#!/usr/bin/perl -swl
my $scalar=45;
my @table=[5, 6, 7];
my %hash=("test"=>"TEST", "abc"=>"ABC", "ghi"=>"GHI");
my @final=[ $scalar, \@table, \%hash];
sub findHashValue{
 my ($contref,$key)=@_;
 my @container=@$contref;
 my $contrefbis=$container[0]; # je ne comprends pas pourquoi je dois déréférencer une deuxième fois ?
 my @containerbis=@$contrefbis;
 print "We search key ->$key<- in @container with ref $contref (first element is $containerbis[0])";
 for($i=0;$i<$#containerbis+1;$i++){
 print $containerbis[$i];
 }
}
findHashValue(\@final,"test");

et non pas ainsi :

#!/usr/bin/perl -swl
my $scalar=45;
my @table=[5, 6, 7];
my %hash=("test"=>"TEST", "abc"=>"ABC", "ghi"=>"GHI");
my @final=[ $scalar, \@table, \%hash];
sub findHashValue{
 my ($contref,$key)=@_;
 my @container=@$contref;
 print "We search key ->$key<- in @container with ref $contref (first element is $container[0])";
 for($i=0;$i<$#container+1;$i++){
 print $container[$i];
 }
}
findHashValue(\@final,"test");

En effet, je ne comprend pas pourquoi je dois déréférencer deux fois ? Quelqu'un peut m'aider ?

Merci !

  • # Mauvaise syntaxe

    Posté par . Évalué à 6.

     my @final=[ $scalar, \@table, \%hash];
    
    

    En fait il faut écrire:

     my @final=( $scalar, \@table, \%hash);
    
    

    avec des parenthèses pour créer ta liste. La syntaxe [] est pour créer une référence à une liste.

    • [^] # Re: Mauvaise syntaxe

      Posté par (site web personnel, Mastodon) . Évalué à 1.

      Merci beaucoup, j'ai regardé 10x mon code et je n'ai jamais pensé à regarder mes définitions ;) Je comprends mieux la documentation sur Tie::ICal alors.

      • [^] # Re: Mauvaise syntaxe

        Posté par (site web personnel, Mastodon) . Évalué à 2.

        Pour compléter, voici donc le code qui fonctionne comme je le souhaite :

        #!/usr/bin/perl -swl
        my $scalar=45;
        my @table=[5, 6, 7];
        my %hash=("test"=>"TEST", "abc"=>"ABC", "ghi"=>"GHI");
        my $final=[$scalar, \@table, \%hash];
        sub findHashValue{
         my ($contref,$key)=@_;
         my @container=@$contref;
         print "We search key ->$key<- in @container with ref $contref (first element is $container[0])";
         for($i=0;$i<$#container+1;$i++){
         print $container[$i];
         }
        }
        findHashValue($final,"test");
        
        

        En effet, c'est bien une référence de tableau que j'ai en utilisant l'outil Tie::iCal.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.