【问题标题】:Perl selectall_array - retrieve all data from array of array refPerl selectall_array - 从数组 ref 的数组中检索所有数据
【发布时间】:2018-06-08 22:33:36
【问题描述】:

我正在使用 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 );

【问题讨论】:

    标签: arrays perl dbi arrayref


    【解决方案1】:

    您可以像这样在一行中将 arrayrefs 取消引用到一个大数组中:

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

    map 块将@$_ 应用于selectall_array 返回的每一行,这会取消对数组引用的引用。

    【讨论】:

      【解决方案2】:

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

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

      更新

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

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

      【讨论】:

      • 或后缀取消引用:= $dbh->selectcol_arrayref(...)->@*;。或者只是作为参考。
      • 后缀取消引用是一个不错的新功能,但请注意,它仅在实验性v5.20 中可用,现在稳定在v5.24
      • @ysth:谢谢。我已更新我的答案以包含您的建议。
      猜你喜欢
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 1970-01-01
      相关资源
      最近更新 更多