Почему я получаю ошибку "Не могу использовать строку как ссылку на HASH", когда пытаюсь получить доступ к элементу хеша?

Как я могу исправить эту ошибку?

foreach (values %{$args{car_models}}) {
   push(@not_sorted_models, UnixDate($_->{'year'},"%o"));
}

Ошибка: Невозможно использовать строку ("1249998666") в качестве ссылки HASH, в то время как "строгие ссылки" используются в /.../BMW.pm строке 222.

3 ответа

Data::Dumper Модуль чрезвычайно полезен в таких ситуациях - чтобы помочь вам понять, почему сложная структура данных не соответствует вашим ожиданиям. Например:

use Data::Dumper;
print Dumper(\%args);

Очевидно, одно из значений в %{ $args{car_models} } не является ссылкой на хеш То есть структура данных не содержит того, что вы думаете, что она делает. Таким образом, вы можете либо исправить структуру данных, либо изменить свой код в соответствии со структурой данных. Поскольку вы не предоставили структуру данных, я не могу это комментировать.

Вы могли бы использовать ref увидеть, если $_ содержит ссылку на хеш, прежде чем пытаться получить доступ к члену.

if ( ref eq 'HASH' and exists $_->{year} ) {
    push(@not_sorted_models, UnixDate($_->{year},"%o")); 
}

Исходя из вашего комментария и моих полномочий ESP, я предполагаю, что эти значения являются временными метками. Итак, я предполагаю, что вы пытаетесь найти год по значению метки времени (количество секунд от эпохи). В этом случае вы, вероятно, хотите localtime или же gmtime:

my $year = 1900 + (localtime)[5];
C: \ Temp> perl -e "print 1900 + (местное время (1249998666))[5]"
2009

Без дальнейшей конкретной информации о том, что должна содержать ваша структура данных, это мое лучшее предположение.

Привет, если у вас есть переменная хеша (например, $hash_ref), то код будет

if ( ref($hash_ref) eq 'HASH' and exists $hash_ref->{year} ) {
    push(@not_sorted_models, UnixDate($hash_ref->{year},"%o")); 
}
#instead of below:
if ( ref eq 'HASH' and exists $_->{year} ) {
    push(@not_sorted_models, UnixDate($_->{year},"%o")); 
}

Спасибо, Манодж Шехават

Другие вопросы по тегам