2010-06-03 4 views
2

Ce code fonctionne:déréférencement hachage de params

my $href = shift @_; # get reference to hash 
    my %h = %{$href};  # dereference hash 

Celui-ci n'a pas:

my %h = %{shift @_}; 

En plus celui-ci:

my %h = ${$_[0]} 

Pourquoi?

=============================

Une fois de plus d'être précisement:

1 #!/usr/bin/perl -w 
    2 use strict; 
    3 use warnings; 
    4 
    5 my %h; 
    6 sub a { 
    7  
    8  # that works - result 1 
    9  my $href = $_[0] || shift; 
10  %h = %{$href}; 
11  
12  # that does not work - result 0 
13  # my %h = %{$_[0]}; 
14  
15  # as well as that one - result 0 
16  # my %h = %{shift @_}; 
17  $h{1}=2; 
18 } 
19 
20 a(\%h); 
21 print scalar (keys %h) . "\n"; 

En d'autres termes, la ligne 16 - ce n'est pas le cas.

+0

J'ai mis à jour ma réponse, votre problème est totalement indépendant. –

Répondre

6

Cela fonctionnera.

my %h = %{shift @_}; 

Ceci ne sera pas le cas.

my %h = ${$_[0]} # not ${$_[0]} 

Ce Sigil est censé être %

my %h = %{$_[0]} 

aussi, use warnings; et use strict;


TRUC: La raison pour laquelle votre exemple ci-dessus ne fonctionne pas, est seulement un exemple ne déclare pas un variab lexical le %h = %{$href}; n'est pas my %h = %{$href};

+1

Quelqu'un n'utilise pas les avertissements et strict? – Demosthenex

+0

@demosthenex: oui, beaucoup de gens malheureusement. – Ether

+0

thx pour l'aide. C'était vraiment une erreur stupide. – name