2010-07-15 11 views
5

Je veux parcourir une référence à un tableau de hachages sans avoir à faire de copies locales, mais je continue d'obtenir Ne peut pas utiliser string ("1") comme ref ARRAY tandis que "strict refs "erreurs. Pourquoi? Comment je le répare?Références en Perl: tableau de hachages

sub hasGoodCar { 
    my @garage = (
       { 
       model => "BMW", 
       year => 1999 
       }, 

       { 
       model => "Mercedes", 
       year => 2000 
       }, 
       ); 

    run testDriveCars(\@garage); 
}  

sub testDriveCars { 
    my $garage = @_; 

    foreach my $car (@{$garage}) { # <=========== Can't use string ("1") as an ARRAY ref while "strict refs" error 
    return 1 if $car->{model} eq "BMW"; 
    } 
    return 0; 
} 

Répondre

7

La ligne

my $garage = @_; 

affecte la longueur du @_ de garage. Dans l'appel à la méthode testDriveCars vous passez un seul argument, d'où la longueur est un, d'où votre message d'erreur sur "1".

Vous pouvez écrire

my ($garage) = @_; 

ou peut-être

my $garage = shift; 

à la place.

Il y a un point-virgule manquant dans l'affichage aussi - après l'affectation de @garage. Pour plus de détails, voir perldoc perlsub pour plus de détails.

+0

Cette erreur fréquente provient de ne pas comprendre le contexte. L'affectation à un scalaire produit un contexte scalaire, ainsi '@ _' est évalué comme scalaire (ce qui donne la longueur). – daotoad