Почему я получаю ошибку "Не могу использовать строку как ссылку на 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"));
}
Спасибо, Манодж Шехават