从params取消引用哈希

nam*_*ame 2 perl hash dereference

此代码有效:

  my $href = shift @_;    # get reference to hash
  my %h = %{$href};       # dereference hash
Run Code Online (Sandbox Code Playgroud)

这个没有:

  my %h = %{shift @_};
Run Code Online (Sandbox Code Playgroud)

除此之外:

  my %h = ${$_[0]}
Run Code Online (Sandbox Code Playgroud)

为什么?

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

再精确一次:

 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";
Run Code Online (Sandbox Code Playgroud)

换句话说,第16行 - 它没有.

Eva*_*oll 6

这会奏效.

  my %h = %{shift @_};
Run Code Online (Sandbox Code Playgroud)

这不会.

  my %h = ${$_[0]} # not ${$_[0]}
Run Code Online (Sandbox Code Playgroud)

应该是这个印记 %

  my %h = %{$_[0]}
Run Code Online (Sandbox Code Playgroud)

还有use warnings;,和use strict;


提示:您上面的例子不工作的原因,仅仅是一个例子不声明词法变量%h = %{$href};my %h = %{$href};