2012-03-13 13 views
1

ハッシュの配列をループして、理解していない。Perlがハッシュの配列をループしていると、 "strict refs"が使用中にHASH refとして文字列( "password")を使用できません

以下は、ダンプを使用してハッシュの配列を作成するコードです。すべてのものがすべて入っているようです。そして、このようにうまくいく。

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}; 
} 

それをループにこのコードを追加した場合、私は、このエラーがで使用中「はrefs」しながら、ハッシュリファレンスとして文字列(「パスワード」)を使用することはできません取得adempiereToExo.pl line 64

今私はこのエラーについて少し読んだことがあり、誰かがハッシュリファレンスではない配列に何かを持っているときに起こるように見えます。しかし、私はそれがここに当てはまるとは思わない。私は非常にPerlに新しいので、私は間違っている可能性があります。また、それは常にハッシュの最後の要素です。

私は、このエラーについて多くの人が尋ねていることを知っていますが、私は多くの答えを読んだことがありますが、まだそれを理解することはできません。

答えて

3

変更この:

push(@adUserInfo, %row); 

(「リストに%row年代のキーと値を展開し、@aduserInfoにそれらのすべてを追加「を意味し、あなたがの明確なアイデアを得るためにprint "@adUserInfo\n"を追加することができますその)これに:

push(@adUserInfo, \%row); 

( "%rowへの参照を作成し、@aduserInfoにその参照を追加")を意味しています。

また、ハッシュの最後の要素でもあります。

これは任意です。ハッシュは順不同なので、最後の要素という概念はありません。

1

次の2つのオプションのいずれかが動作するはず:

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

をそれらの両方は、アレイスタックにハッシュリファレンスを押し、最初にハッシュを逆参照することによってそうします。 2番目は、ハッシュをリストに分割し、そのリストの内容をハッシュリファレンスに入れてハッシュリファレンスを作成します。


$rowRefの代わりには、ハッシュリファレンスの配列である配列をループされているため、あなたのエラーが来て、ハッシュのキーと値の一次元アレイです。私は通訳が"password"->{password}とあなたのコードを見ていると思うし、そのエラーが正しい、あなたはハッシュリファレンスとして文字列を使用することはできません。

関連する問題