【问题标题】:push hash ref into array ref perl将哈希引用推入数组引用 perl
【发布时间】:2015-12-10 10:49:04
【问题描述】:

我正在从数据库中获取数据......我想要实现的是为每个获取的数据行(id,title)创建一个哈希引用

{
   id => data->[0],
   title => data[1]
}

并将这个哈希引用推送到数组引用中以创建以下格式

 {  category => [
                   {
                    id => 1,
                    title => "title1"
                   },
                   {
                   id => 2,
                   title => "title2"
                   }
                  ]
              }

我做了什么:

   my $productCategories->{category} = [];
    my $product = {};
    my $sth = $dbh->prepare(qq[SELECT id,title FROM ].DB_SCHEMA().qq[.product_categories]) || die $dbh->errstr;
    $sth->execute() || die $dbh->errstr;
    while(my $data = $sth->fetch){
        $product =  {
                    id      =>  $data->[0],
                    title   =>  $data->[1]
                    };
        push $productCategories->{category}, $product;
    }

但它不起作用......

【问题讨论】:

标签: arrays perl hash


【解决方案1】:

DBI 有许多获取数据的方法。其中之一称为fetchall_arrayref(),它将以您需要的结构返回数据 - 无需自己构建。

my $sth = $dbh->prepare(qq[SELECT id,title FROM ] .
                        DB_SCHEMA() .
                        qq[.product_categories])
  || die $dbh->errstr;

$sth->execute() || die $dbh->errstr;

# Pass a hash ref to get each row back as a hash.
$productCategories->{category} = $sth->fetchall_arrayref({});

【讨论】:

    【解决方案2】:

    打开use strict;use warnings;,它会告诉你原因。

    push on reference 是实验性的

    不是数组引用

    试试:

    push @{$productCategories->{category}}, $product;
    

    另外:在循环之外声明你正在pushing 的事情要小心——在这种情况下你应该没问题,但请记住你正在推送一个引用。如果您重复使用变量,您可以最终推送相同的引用。

    【讨论】:

    • 在我的示例中。但也许你需要更清楚你所说的“不工作”是什么意思。
    • 使用警告 Data::Dumper::Dumper(@{$productCategories->{category}});我得到这个回复:'id' => 2 }; $VAR3 = { 'title' => 'pizza', 'id' => 3 }; $VAR4 = { 'title' => "\x{396}\x{3c5}\x{3bc}\x{3b1}\x{3c1}\x{3b9}\x{3ba}\x{3ac} ", 'id' => 4 };
    • 您需要将 ref 传递给 Data::Dumperprint Dumper $productCategories 应该可以解决问题。
    猜你喜欢
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 2014-01-04
    • 2011-12-29
    • 2012-09-21
    • 2017-01-06
    相关资源
    最近更新 更多