Perl, перебирающий массив хэшей, дает Can't использовать строку («пароль») в качестве ссылки HASH, в то время как «строгие ссылки» используются в - PullRequest
1 голос
/ 13 марта 2012

Попытка перебрать массив хэшей и получить сообщение об ошибке, которое я не понимаю.

Ниже приведен код, который создает массив хэшей с использованием 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};
}

Я получу эту ошибку Не могу использовать строку ("пароль") какссылка на HASH, в то время как «строгие ссылки» используются в строке adempiereToExo.pl 64

Теперь я немного прочитал об этой ошибке, и в большинстве случаев похоже, что это происходит, когда у кого-то есть что-то в массивеэто не ссылка на хешНо я не думаю, что это так.Я очень плохо знаком с Perl, поэтому могу ошибаться.Кроме того, это всегда последний элемент хэша, о котором он стонет?

Я знаю, что многие люди спрашивают об этой ошибке, но я прочитал много ответов и до сих пор не могу понять.

Ответы [ 2 ]

3 голосов
/ 13 марта 2012

Изменить это:

push(@adUserInfo, %row);

(что означает «развернуть ключи и значения %row в список и добавить их все к @aduserInfo»; вы можете добавить print "@adUserInfo\n", чтобы получить более ясное представление об этом) к этому:

push(@adUserInfo, \%row);

(что означает «создать ссылку на %row и добавить эту ссылку на @aduserInfo»).

Кроме того, это всегда последний элемент хэша, о котором он стонет?

Это произвольно. Хэши неупорядочены, поэтому понятия «последний элемент» не существует.

1 голос
/ 13 марта 2012

Любой из следующих двух вариантов должен работать:

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

Они оба помещают хэш-ссылку в стек массива, первый делает это путем разыменования хеш-функции. Второй создает хэш-ссылку, разбивая хэш на список и помещая содержимое этого списка в хэш-ссылку.


Ваша ошибка возникает из-за того, что $rowRef проходит через массив, который вместо массива хэш-ссылок представляет собой одномерный массив ключей и значений хеша. Я думаю, что интерпретатор видит ваш код как "password"->{password}, и его ошибка верна, вы не можете использовать строку в качестве хэш-ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...