Dans le code qui télécharge des feuilles de calcul Excel, il me donne les données dans le tableau réf:

for( @{$listref} ){...

J'y accède avec $_->{'whateverthehashkeyis'} et je n'ai aucun problème.

Ce que je dois faire est de transmettre le hachage auquel j'accède dans l'itération actuelle de la boucle à un autre sous-programme.

C'est là que j'ai des problèmes. J'ai essayé différentes choses sans succès.

Cela NE FONCTIONNE PAS, mais cela devrait être un exemple de ce que je dois faire

%args = @{$_};

$results = &format_trading_card_preview_item(\%args);
....
sub format_trading_card_preview_item
{
    my %args = shift;

Je pense que ce que je dois faire, c'est déréférencer le hachage pour l'envoyer. Est-ce correct?

Merci d'avance pour votre aide

2
Mike Carville GleTech 23 déc. 2015 à 18:46

2 réponses

Meilleure réponse

Il semble que $listref est une référence à un tableau de références de hachage.

Si vous devez utiliser la variable contenant les références de hachage, il est préférable de nommer cette variable au lieu d'utiliser le scalaire par défaut $_

Il est également inutile de déréférencer le hachage et de le copier dans %args, uniquement pour prendre une référence à ce hachage et le passer en paramètre à votre sous-programme

Et il est faux d’appeler un sous-programme avec un caractère esperluette &, et c’est le cas depuis l’arrivée de Perl v5.5 il y a plus de dix-sept ans.

Votre boucle devrait ressembler à ceci

for my $item ( @$listref ) {
    format_trading_card_preview_item($item);
}

Dans le sous-programme, cela dépend beaucoup de ce que vous voulez faire avec le hachage passé, mais vous ne dites rien à ce sujet, il est donc probablement préférable de le laisser comme référence et d'écrire

sub format_trading_card_preview_item {
    my ($item) = @_;
    ...
}

Ou vous pouvez utiliser la forme modificateur d'instruction de for, comme ceci

format_trading_card_preview_item($_) for @$listref;
3
ysth 23 déc. 2015 à 17:33

Pour répondre à votre question, vous n'avez pas besoin de déréférencer la référence de hachage pour la transmettre à un autre sous-programme. Créer une copie superficielle et ensuite prendre une référence à ce nouveau hachage est inefficace, mais cela fonctionnerait techniquement très bien.

Cependant, votre problème est que vous confondez les hachages et les tableaux en utilisant la syntaxe pour déréférencer une référence de tableau sur quelque chose qui est en fait une référence de hachage. En fait, vous auriez dû recevoir un message d'erreur disant essentiellement la même chose:

Pas une référence ARRAY à la ligne foo.pl ...

Ce que vous voulez réellement faire, c'est quelque chose comme ceci:

for my $href (@$listref) {  # variable names could be better
    # do something
    my $results = format_trading_card_preview_item($href);
    # do something else
}

sub format_trading_card_preview_item {
    my $args = shift;
    print $args->{foo};
    return 42;
}

Consultez perlreftut et perlref pour plus d'informations sur les références Perl et les structures de données imbriquées.

1
Matt Jacob 23 déc. 2015 à 16:28