Предупреждение говорит вам, что там ничего на $_[0]->[0]
. Он не умирает и не говорит вам, что вы ничего не индексируете, поэтому $_[0]
, скорее всего, является arrayref, но в первом слоте ничего нет - или, возможно, он указывает на пустой массив.
- Если бы это была пустая строка или 0, она бы не жаловалась.
- Если бы там была какая-либо ссылка, вы могли бы напечатать что-нибудь, даже если бы только:
BLAH(0x80af74)
. (Где «BLAH» - это «ARRAY», «HASH», «SCALAR», «REF», «GLOB», «IO», ...)
Я предлагаю вам сделать это:
use Data::Dumper;
say Data::Dumper->Dump( [ $_[0] ] ); # or even say Data::Dumper->Dump( [ \@_ ] )
, а затем посмотрите на вывод.
После того, как вы получили хеш-адрес в $_[0]->[0]
, тогда, если вам нужно перебрать хэш, лучшим способом будет:
while ( my ( $key, $value ) = each %$hashref ) {
do_stuff_with_key_and_value( $key, $value );
}
см. each
Наконец, кажется, что у вас какая-то путаница с символами. В последней части этой ссылки приведена приличная попытка объяснить, что сигилы ('$'
, '@'
, '%'
) не являются частью имени переменной, но указывают на то, что мы хотим получить от него. Проблемы компиляции Perl