2

DBI selectall_array用来从mysql中获取所有数据。我的查询为每一行返回 1 列。但是该selectall_array函数为每一行返回一个数组 ref 数组,如下所示

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

我想要的是一种将所有域提取到单个数组(无引用)中的方法,或者是否有一个 DBI 函数可以返回完整的数据数组而没有任何引用?我不想遍历所有数据或fetchrow_array在 while 循环中执行。如果可能的话,正在寻找一个单一的声明来完成这一切吗?

请在下面查看我的代码:

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

2 回答 2

5

由于您只提取一列,您可以尝试该selectcol_arrayref()方法 - 取消引用内联数组。

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

更新

正如评论中建议的那样,您可以在更新版本的 Perl(v5.20.0 及更高版本)中使用后缀运算符来取消引用selectcol_arrayref()- 返回的值,如下所示。

$dbh->selectcol_arrayref('SELECT domain FROM dfs', undef, @params)->@*;
于 2017-12-28T14:41:03.000 回答
2

您可以将 arrayrefs 取消引用到一行中的一个大数组中,如下所示:

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

map块适用@$_于由返回的每一行selectall_array,这会取消对 arrayref 的引用。

于 2017-12-28T13:38:54.877 回答