【问题标题】:Can someone explain hashes in Perl?有人可以解释 Perl 中的哈希吗?
【发布时间】:2011-05-31 17:25:06
【问题描述】:

主要功能:

my %hash = {'inner1'=>{'foo'=>5},
            'inner2'=>{'bar'=>6}};
$object->State(0, %AMSValues);

发送至:

sub State
{
   my ($self, $state, %values) = @_;
   my $value = \%values;

据我所知,一个应该是哈希,另一个是指针,但是...

图片看起来不像是这样,

$value = $value->{"HASH(0x52e0b6c)"}
%values = $values->{"HASH(0x52e0b6c)"}

【问题讨论】:

  • 您的意思是将%hash 传递给State 方法吗?我不知道%AMSValues来自哪里。

标签: perl function pointers hash


【解决方案1】:

use warnings; 总是。

你的:

my %hash = {'inner1'=>{'foo'=>5},
            'inner2'=>{'bar'=>6}};

不正确; {} 生成一个匿名哈希引用,%hash 获取一个键(该哈希引用字符串化)和一个 undef 值。

你想要的:

my %hash = ('inner1'=>{'foo'=>5},
            'inner2'=>{'bar'=>6});

就传递给子程序而言,你不能传递哈希值;像您显示的代码将散列扁平化为列表,然后从@_ 重新组合散列,但这将是一个单独的副本。如果您确实想要相同的哈希,则必须改为传递哈希引用。

【讨论】:

  • +1 表示use warnings;(也是很好的答案)。也总是use strict;
  • 我正在使用警告,但我也在使用 5.012,我认为它会自动添加严格和警告。
  • @Eric Fossum:那么您应该已经从您的哈希分配中看到了“在预期偶数大小列表的位置找到参考”警告
  • @ysth 'Reference found where even-sized list expected' 是否意味着它没有被初始化?
  • 不,这意味着你正在分配一个哈希,它需要一个交替键和值的列表,但是你给它一个引用(在这种情况下是一个哈希)。见perldoc.perl.org/…
猜你喜欢
  • 2011-07-20
  • 2012-01-11
  • 1970-01-01
  • 2013-06-17
  • 2011-07-17
  • 2012-05-29
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多