2008-11-25 14 views
0

question simple:Comment référencer un scalaire dans une référence de hachage en Perl?

Comment puis-je faire cela sur une seule ligne:

my $foo = $bar->{baz}; 
fizz(\$foo); 

J'ai essayé \ bar $ -> {baz}, \ $ {$ bar -> {baz}}, et de nombreux autres. Est-ce seulement possible?

-fREW

Mise à jour: Ok, le hashref vient de DBI et je passe l'arbitre scalaire en boîte à outils du modèle. Je suppose maintenant que je regarde de plus près la question est quelque chose à faire avec comment TT fait tout cela. En effet, je veux dire:

$template->process(\$row->{body}, $data); 

Mais TT ne fonctionne pas de cette façon, TT prend une ref scalaire et met les données là-bas, donc je dois faire:

$template->process(\$row->{body}, $shopdata, \$row->{data}); 

Quoi qu'il en soit , Merci pour l'aide. Je vais au moins avoir une référence au lieu de deux.

+0

Sur la base de ce que je pense u peut-être essayer de faire u devrait jeter un oeil à l'option EXPOSE_BLOCKS dans TT. Cela vous permet de traiter des blocs dans un modèle plusieurs fois ... $ template-> process ("table.tt/row", {data => 1}); & ensuite dans le modèle table.tt [% BLOCK row%] [% data%] [% END%] – draegtun

+0

En référence à votre mise à jour, voir la mise à jour de ma réponse. – runrig

Répondre

5
\$bar->{baz} 

devrait fonctionner.

E.g.:

my $foo; 
$foo->{bar} = 123; 

my $bar = \$foo->{bar}; 

$$bar = 456; 

print "$foo->{bar}\n"; # prints "456" 

En réponse à la mise à jour dans l'OP, vous pouvez faire:

\@$row{qw(body data)}; 

Ce n'est pas la même chose que \ @array, ce qui créerait une référence à un tableau. Ce qui précède va distribuer la référence et faire une liste de deux références.

0

Je ne suis même pas sûr de ce que vous faites. Vous devriez également mettre des citations autour de baz.

Considérons maintenant que vous attribuez un scalaire au scalaire dans la première ligne, alors la deuxième ligne devrait fonctionner. Cependant, je ne sais pas vraiment si c'est ce que vous essayez ici et cela n'a pas vraiment de sens dans Perl. Utilisation des références est souvent utilisé dans d'autres langues à

  1. vitesse un appel de fonction
  2. permettent plusieurs valeurs à retourner.

Maintenant, la première est généralement pas nécessaire avec scalaires et de toute façon Perl est un langage de script, donc si vous êtes vraiment préoccupé par la vitesse d'écriture C.

Le second n'est pas nécessaire en Perl comme vous pouvez retourner des listes et les références aux hashes anonymes sont assez faciles.

Avez-vous regardé "man perlref"?

+0

Il n'y a aucune raison de mettre des citations autour de baz. Perl autoquote les clés de hachage si elles sont constituées entièrement de caractères w. – runrig

+0

En outre, le passage de références scalaires est utile, par exemple, en bioinformatique, où vous pouvez éviter d'effectuer des copies de grandes quantités de données. – runrig

2

Vous ne présentez pas comment% bar et Fizz() ont été installés, alors je les ai mis en place comme ceci:

my %hash; 
my $bar = \%hash; 
$hash{baz} = "found it\n"; 
sub fizz { 
    my $ref = shift; 
    print $$ref; 
} 

Ensuite, ces deux travaux, votre Orignal:

my $foo = $bar->{baz}; 
fizz(\$foo); 

et l'une des variantes, vous avez dit que vous avez essayé:

fizz(\$bar->{baz}); 

Pouvez-vous montrer l'erreur qui te donne?

4

\ bar $ -> {} baz semble faire l'affaire pour moi:

my $bar = { baz => 1 }; 
print $bar->{baz}, "\n"; # prints 1 
my $ref = \$bar->{baz}; 
print $$ref, "\n";  # prints 1 
$$ref = 2; 
print $bar->{baz}, "\n"; # prints 2