Perl, имитирующий Net :: DBI fetchall_arrayref () - PullRequest
1 голос
/ 06 октября 2010

Мне нужно смоделировать массив, как если бы он был возвращен из функции Net :: DBI fetchall_arrayref.

Допустим, что SQL-запрос похож на "SELECT data1, data2, data3 from table1"

У меня есть XML-файл как

<type1> 
  <data1>a</data1>
  <data2>b</data2>
  <data3>c</data3>
</type1>
<type1> 
  <data1>da</data1>
  <data2>db</data2>
  <data3>dc</data3>
</type1>

Я прочитал этот XML-файл, используя XML :: Simple, чтобы получить полный массив данных, например:

$VAR1 = {
          'type1' => [
                     {
                       'data2' => 'b',
                       'data3' => 'c',
                       'data1' => 'a'
                     },
                     {
                       'data2' => 'db',
                       'data3' => 'dc',
                       'data1' => 'da'
                     }
                   ]
        };

Как мне получить этот массив в форму, которая будет такой же, как и возвращенная fetchall_array_ref?

Я делаю что-то вроде этого:

#REad from testin.xml file
$data = $xml->XMLin('testin.xml');

@testdata = $data->{type1};

$i = 0;
foreach $e (@{$data->{type1}})
{
        $simulate_data[$i++] = \$e;
}

Пожалуйста, помогите.

1 Ответ

2 голосов
/ 06 октября 2010

fetchall_arrayref() возвращает ссылку на массив, который содержит одну ссылку на строку.Вы хотите превратить каждый набор значений в ссылке на хэш в ссылку на массив.Это должно работать:

my $arr_ref;
foreach my $hashref ( @{$data->{'type1'}} ) {
  push @$arr_ref, [ sort values %$hashref ];
}

Это дает мне следующее (через Data :: Dumper):

$VAR1 = [
          [
            'a',
            'b',
            'c'
          ],
          [
            'da',
            'db',
            'dc'
          ]
        ];

(В стороне: пожалуйста, всегда ставьте use strict; в своих программах.)

...