2009-08-12 15 views
7

Jak naprawić ten błąd?Dlaczego podczas próby uzyskania dostępu do elementu skrótu pojawia się komunikat "Nie można użyć ciągu znaków jako znaku HASH"?

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

Błąd: nie można używać znaków ("1249998666") jako ref HASH podczas "surowe bibl" w użyciu w linii /.../BMW.pm 222.

+1

@Kys Struktura danych jest pan pisał niezgodny z powyższym kodem i komunikatem o błędzie. –

Odpowiedz

9

wyraźnie jeden wartości w %{ $args{car_models} } nie jest odwołaniem hash. Oznacza to, że struktura danych nie zawiera tego, co myślisz, że robi. Możesz więc albo naprawić strukturę danych, albo zmienić kod, aby pasował do struktury danych. Ponieważ nie dostarczyłeś struktury danych, nie mogę tego komentować.

Możesz użyć numeru ref, aby sprawdzić, czy $_ zawiera odwołanie do skrótu przed próbą uzyskania dostępu do elementu.

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

Na podstawie twojego komentarza i moich uprawnień ESP zakładam, że te wartości są znacznikami czasowymi. Tak więc zgaduję, próbujesz znaleźć rok z wartości znacznika czasu (liczba sekund z epoki). W tym przypadku, prawdopodobnie chcesz localtime lub gmtime:

my $year = 1900 + (localtime)[5]; 
 
C:\Temp> perl -e "print 1900 + (localtime(1249998666))[5]" 
2009 

Bez dalszych, konkretnych informacji o tym, co struktura danych ma zawierać, to mój najlepszy przypuszczenie.

+0

Moim zamiarem jest przekazanie tych liczb do tablicy @non_sorted_models jako liczby, aby można było wywoływać sortowanie w tablicy. Jak przekonwertować go na liczbę całkowitą – Kys

+0

Przy okazji, wprowadzenie tych kontroli nadal dawało mi te same błędy. – Kys

+1

@Kys Nie rozumiem, co mówisz. Czy mówisz, że "wartości% {$ args {car_models}}" nie powinny być hashami? Jeśli tak jest, dlaczego je wyreklamujesz, tak jak powinny? ** Pokaż swoją strukturę danych ** W przeciwnym razie jest to przypadek niewidomego przewodzenia w ciemno. –

11

Moduł Data::Dumper jest bardzo przydatny w takich sytuacjach - aby pomóc Ci zrozumieć, dlaczego złożona struktura danych nie spełnia Twoich oczekiwań. Na przykład:

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

Cześć jeśli masz zmienną hash ref (jak $ hash_ref), a następnie kod będzie

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

Dzięki Manoj Shekhawat

Powiązane problemy