Perl selectall_array - получить все данные из массива ref.

Я использую DBIselectall_array извлечь все данные из mysql. Мой запрос возвращает 1 столбец для каждой строки. Но selectall_array функция возвращает массив ref для каждой строки, как указано ниже

$VAR1 = [
          '1.ptmp'
        ];
$VAR2 = [
          'e1.ptmp'
        ];
$VAR3 = [
          's2.ptmp'
        ];
$VAR4 = [
          'sw1.ptmp'
        ];
$VAR5 = [
          'w1.ptmp'
        ];

Что я хотел бы, это способ извлечь все домены в один массив (без ссылок) или есть функция DBI, которая возвращает полный массив данных без каких-либо ссылок? Я не хочу перебирать все данные или делать fetchrow_array в то время как цикл. Ищете одно заявление, чтобы сделать все это, если это возможно?

Пожалуйста, смотрите мой код ниже:

my @mysqldata = $dbh->selectall_array('SELECT `domain` FROM dfs WHERE `id` IN ('.join(',',('?')x(scalar(@params))).')', {}, @params);
my @minus = array_minus( @all, @mysqldata );

2 ответа

Решение

Вы можете разыменовать arrayrefs в один большой массив в одной строке следующим образом:

my @all = map {@$_} $dbh->selectall_array($sql);

map блок применяется @$_ к каждой строке, возвращаемой selectall_array, который разыменовывает arrayref.

Поскольку вы извлекаете только один столбец, вы можете попробовать selectcol_arrayref() Метод - разыменование массива в строке.

my @mysqldata = @{ $dbh->selectcol_arrayref('SELECT `domain` FROM dfs WHERE `id` IN ('.join(',',('?')x(scalar(@params))).')', {}, @params) };

ОБНОВИТЬ

Как подсказывает ysth в комментариях, вы можете использовать оператор postfix в более новых версиях Perl (v5.20.0 и новее) для разыменования значения, возвращаемого selectcol_arrayref() - как в следующем.

$dbh->selectcol_arrayref('SELECT domain FROM dfs', undef, @params)->@*;
Другие вопросы по тегам