Почему я получаю ARRAY (0x8470d6c) вместо списка из моей конфигурации YAML? - PullRequest
1 голос
/ 24 декабря 2009

У меня есть этот файл YAML:

name: Firas
dirs: [/bin/, /home/phiras/]

Я использую YAML :: Syck в perl для анализа этого файла, и у меня проблема с доступом к элементам dirs мой код:

#!/usr/local/bin/perl

use strict;
use warnings;
use YAML::Syck;
use ConfigLoader;
use Data::Dumper;

my $conf = LoadFile("myconf.yml") || die("Error: Open config file \n");

print $conf->{name}, "\n";

my @dirs = $conf->{dirs};

print Dumper @dirs;
foreach(@dirs){
        print "$_\n";
}

вывод:

    Firas
    $VAR1 = [
              '/bin/',
              '/home/phiras/'
            ];
    ARRAY(0x8470d6c)

как видите, цикл печатает один элемент, и он считается массивом. я делаю это правильно?

Ответы [ 2 ]

15 голосов
/ 24 декабря 2009

Я думаю, проблема в том, что $conf->{dirs} - это arrayref, а не массив. Попробуйте это:

my @dirs = @{$conf->{dirs}};
1 голос
/ 25 декабря 2009

Мне нравится использовать метод класса Dump для Data::Dumper. Вы даете ему два анонимных массива. Первый - это список вещей, которые нужно сбросить, а второй - это список имен, которые должны давать переменные вместо $VARn. Если перед именем стоит *, Dump вычисляет тип данных и записывает его как этот тип вместо ссылки:

 print Data::Dumper->Dump( [ \@dirs ], [ qw(*dirs) ] );

Результат более точно отражает то, что у вас есть, так как вам не нужно делать мысленное отображение обратно к @dirs. Теперь легко увидеть, что у вас есть массив из одного элемента:

@dirs = (
          [
            '/bin/',
            '/home/phiras/'
          ]
        );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...