7
votes

Comment est-ce que je dérégence une référence de hash perl a été transmise à un sous-programme?

J'essaie toujours de régler mon déréférencissage de hachage. Mon problème actuel est que je suis maintenant en train de passer un hashref à un sous-produit et je veux la désirer dans ce sous-produit. Mais je ne trouve pas la méthode / la syntaxe correcte pour le faire. Dans le sous-bas, je souhaite itérer les clés de hachage, mais la syntaxe d'un hashref n'est pas la même chose qu'un hash, que je sais faire.

Ce que je veux, c'est faire ceci: < Pré> xxx

mais avec un hashref étant transmis au lieu d'un hachage.


0 commentaires

5 Réponses :


3
votes

J'ai vraiment testé le code à ce moment-là, mais écrivez à main levée, vous voudrez faire quelque chose comme ceci:

sub foo {
    $parms = shift;
    foreach my $key (keys %$parms) { # do something };
}


3 commentaires

L'utilisation de décalage au lieu de @_ a fait l'affaire, et bien sûr, à l'aide d'un scalaire au lieu d'un hash pour la variable. Code de travail: Sub FOO {$ Parms = Shift; foreach $ clé (clés% $ parmi) {impression "$ clé: $$ parms {$ clé} \ n"; } } Merci!


shift vs. @_ n'est pas pertinent. mon ($ hashref) = @_; fonctionnera aussi bien.


@Nobody Oui THX, dans ce contexte, mais ne pas dire qu'il n'y a pas de différence significative entre shift et @ généralement. Le @ sans parenthèses mon $ hashref = @_; retournerait un scalaire (= le nombre de paramètres passés) ou éventuellement une gamme complète de paramètres passés utilisés comme ceci => mon @var = @_; . Fonctionnerait la même chose / dans votre affectation de «destructuration» mon ($ hashref) = @_;



2
votes

Voici un moyen de déréférenfer à un hachage Ref passé à un SUB:

use warnings;
use strict;

my %pars = (a=>1, b=>2);
foo(\%pars);
sub foo {
    my ($href) = @_;
    foreach my $keys (keys %{$href}) { print "$keys\n" }
}

__END__
a
b


0 commentaires

2
votes
sub foo
{
    my $params = $_[0];
    my %hash = %$params;
        foreach $keys (keys %hash)
        {
         print $keys;
        }
}

my $hash_ref = {name => 'Becky', age => 23};

foo($hash_ref);
Also a good intro about references is here.

1 commentaires

Merci pour le lien. J'utilise celui-là comme référence, mais je ne l'ai toujours pas tout à fait la compréhension.



1
votes
#!/usr/bin/perl
use strict;

my %params = (
    date => '2010-02-17',
    time => '1610',
);

foo(\%params);

sub foo {
    my ($params) = @_;
    foreach my $key (keys %$params) {
        # Do something
        print "KEY: $key VALUE: $params{$key}\n";
    };
}

2 commentaires

EEP, n'ai pas vu Toolics réponse jusqu'à juste maintenant. ;X


Je dirais que sa nommée est meilleure (nommer le hashref comme href).



0
votes

Déréférence La référence initiale, mais utilisez-la comme une autre / sa copie, ce qui est également très courant ou plus courant. XXX


0 commentaires