В Perl, как вы получаете доступ к значению из ссылки в массиве hashrefs? - PullRequest
4 голосов
/ 27 октября 2009

У меня есть массив ссылок на анонимные хеши. Из ссылки на этот массив $allDirArray я хочу получить доступ к значению, соответствующему ключу 'dir'. В настоящее время я получаю сообщение об ошибке:

Can't use string ("HASH(0x100878050)") as a HASH ref while "strict refs" 
in use at nameOfProgram.pl line 148.

Мой код:

my $tempDir = ${$allDirArray}[$i]{'dir'};

Ответы [ 5 ]

6 голосов
/ 27 октября 2009

Сообщение об ошибке указывает на то, что вы на самом деле пытаетесь использовать строку "HASH(0x100878050)" в качестве хэш-ссылки. Поэтому я подозреваю, что вам как-то удалось структурировать ваши хэши (то есть вы использовали их как строки, а Perl превратил их в строки для вас). Один из способов это может произойти, если вы присваиваете хэш-ключ хеш-ключу (хеш-ключи могут быть только строками) или заключаете в кавычки переменные в присваивании, подобном следующему

Таким образом, внутри ${$allDirArray}[$i] находится строка, содержащая "HASH (0x100878050)", буквально это, в строке. Не хеш.

Лучше всего подтвердить это, вероятно, сбросить структуру данных. Вы можете сделать это с помощью Data :: Dumper :

use Data::Dumper;
print Dumper($allDirArray);
3 голосов
/ 27 октября 2009
 $allDirArray->[$i]->{dir}

См. perldoc perlreftut .

Теперь, я думаю, Дан имеет правильный диагноз вашей проблемы. Итак, FAQ Что плохого в том, чтобы всегда заключать в кавычки "$ vars"? может быть полезным.

2 голосов
/ 27 октября 2009

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

#! perl
use warnings;
use strict;

my $allDirArray = [{dir => "b"},{c => "d"}];
my $i = 0;
my $tempDir = ${$allDirArray}[$i]{'dir'};
print "$tempDir\n";

Как написано выше, с использованием Perl 5.10 на Cygwin программа работала следующим образом:

$ perl allarraydir.pl
b

Сообщение об ошибке не печаталось. Смотри http://codepad.org/pH4eyMlt

Редактировать

После включения предложения Телемаха, я добавил следующий код в конец вышеуказанной программы:

# The following addition was included re telemachus's comment
my @allDirArray2 = ({dir => "b"},{c => "d"});
$tempDir = ${$allDirArray2}[$i]{'dir'};
print "$tempDir\n";

запустил его снова и получил следующее сообщение об ошибке:

$ perl allarraydir.pl
Global symbol "$allDirArray2" requires explicit package name at 
allarraydir.pl line 10.
Execution of allarraydir.pl aborted due to compilation errors.

(это действительно должен быть комментарий к вашему вопросу, а не ответ, но код слишком длинный.)

0 голосов
/ 28 октября 2009

Каким-то образом вам удалось превратить свой анонимный хеш в строку.

Вот краткий пример, который вызывает эту ошибку.

use strict;
use warnings;

my $allDirArray = [ ''.{ 'dir' => 'somedir' } ];

my $tempdir = ${$allDirArray}[0]{'dir'};
# or
my $tempdir = $allDirArray->[0]{'dir'};
Can't use string ("HASH(0x8555168)") as a HASH ref while "strict refs" in use at nameOfProgram.pl line 8.
0 голосов
/ 27 октября 2009
$$allDirArray[$i]->{'dir'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...