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  (site web personnel) . É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.