Perl selectall_array - 从数组ref的数组中检索所有数据

时间:2017-12-28 11:14:07

标签: arrays perl dbi arrayref

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

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

我想要的是一种将所有域提取到单个数组(没有引用)的方法,或者是否有DBI函数返回完整的数据数组而没有任何引用?我不想循环遍历所有数据或在while循环中执行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 个答案:

答案 0 :(得分:4)

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

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

<强>更新

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

$dbh->selectcol_arrayref('SELECT domain FROM dfs', undef, @params)->@*;

答案 1 :(得分:2)

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

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

map块将@$_应用于selectall_array返回的每一行,它取消引用arrayref。