【问题标题】:Perl looping through an array of hashes, gives Can't use string ("password") as a HASH ref while "strict refs" in use atPerl 循环遍历哈希数组,给出 Can't use string ("password") as a HASH ref while "strict refs" in use at
【发布时间】:2012-03-13 02:30:45
【问题描述】:

尝试遍历哈希数组并收到我不理解的错误消息。

下面是创建哈希数组的代码,使用 Dumper 它似乎包含了所有东西。像这样它运行良好。

while ($getAdUserInfo->fetch()){

$name = $name || '';
$isactive = $isactive || ''; 
$loginid = $loginid || '';
$account_status = $account_status || '';
$password = $password || '';
#print "$name, $isactive, $loginid, $account_status, $password\n"; 
my %row = (
    name => $name, 
    isactive => $isactive, 
    loginid => $loginid, 
    account_status => $account_status, 
    password => $password,
);
push(@adUserInfo, %row);
}

但是如果我添加这段代码来循环它

for my $rowRef (@adUserInfo)  {
print $rowRef->{password};
}

我收到此错误 Can't use string ("password") as a HASH ref while "strict refs" in use at adempiereToExo.pl line 64

现在我已经对该错误进行了一些阅读,并且大多数情况下看起来它发生在有人在数组中有不是哈希引用的东西时。但我认为情况并非如此。我对 Perl 非常陌生,所以我可能是错的。此外,它总是抱怨哈希中的最后一个元素?

我知道有很多人问这个错误,但是我已经阅读了很多答案,仍然无法弄清楚。

【问题讨论】:

    标签: perl


    【解决方案1】:

    改变这个:

    push(@adUserInfo, %row);
    

    (这意味着“将%row 的键和值展开到列表中,并将它们全部添加到@aduserInfo”;您可以添加print "@adUserInfo\n" 以更清楚地了解这一点)到此:

    push(@adUserInfo, \%row);
    

    (意思是“创建对%row 的引用,并将该引用添加到@aduserInfo”)。

    它总是抱怨哈希中的最后一个元素吗?

    这是任意的。哈希是无序的,因此没有“最后一个元素”的概念。

    【讨论】:

    • 在 Perl 调试器中使用“x @adUserInfo”也有助于找出发生了什么(即出了什么问题)。
    【解决方案2】:

    以下两个选项中的任何一个都应该起作用:

    1. push @adUserInfo, \%row;
    2. push @adUserInfo, {%row};

    它们都将 hashref 推入数组堆栈,第一个是通过取消引用散列来实现的。第二个方法通过将哈希分解成一个列表并将该列表的内容放入一个 hashref 来创建一个 hashref。


    您的错误即将到来,因为$rowRef 正在循环遍历数组,该数组不是哈希引用数组,而是哈希键和值的一维数组。我认为解释器将您的代码视为"password"->{password},它的错误是正确的,您不能将字符串用作 hashref。

    【讨论】:

      猜你喜欢
      • 2015-03-11
      • 1970-01-01
      • 2016-08-20
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      相关资源
      最近更新 更多