fetchrow_hashref还是fetchhash?

时间:2016-04-01 14:28:15

标签: mysql perl dbi

我想知道是否有人可以帮助我解决旧的perl代码令人沮丧的问题。我的实际任务是将旧的perl脚本从V5.10.1迁移到5.18.2。

所以我已经完成了脚本的简单问题,比如错误的调用,错误的格式等等。

但我坚持使用一个名为fetchhash的函数,似乎就像fetchrow_hashref;

我打算抓住IP列表,名称服务器ID和名称。我的问题是,函数fetchrow_hashref不像旧代码中的fetchhash那样做。

请参阅以下新代码:

        #fetch_network();
        $res2=$dbh->prepare("select nsip,nsid,nsname from nameservers");
        $res2->execute();

        while (%ns2=$res2->fetchrow_hashref;{
            $nsips{$ns2{nsid}}=$ns2{nsip};
            $nsnames{$ns2{nsid}}=$ns2{nsname};
        }

表格如下:

+-----------------+------+------------------------------+
| nsip            | nsid | nsname                       |
+-----------------+------+------------------------------+
| 101.101.111.10  |    1 | ns1.yournameserver.net       |

以下是旧代码的一部分:

$res2=$dbh->query("select nsip,nsid,nsname from nameservers");
while (%ns2=$res2->fetchhash)
{
$nsips{$ns2{nsid}}=$ns2{nsip};
$nsnames{$ns2{nsid}}=$ns2{nsname};
}

所以我尝试了fetchrow_hashref,但它对我没用:

main::(nsconfgen.pl:170):               while (%ns2=$res2->fetchrow_hashref){
DB<193> n
Reference found where even-sized list expected at nsconfgen.pl line 170.
at nsconfgen.pl line 170.
main::(nsconfgen.pl:171):                     $nsips{$ns2{nsid}}=$ns2{nsip};
DB<193> p $ns2{nsid}

( i've get no value from the hash )

当然,我已经浏览了谷歌,我尝试了很多例子,但没有什么可以帮助实现......

所以我希望我能得到一些帮助。

非常感谢!

1 个答案:

答案 0 :(得分:1)

DBI实现者​​中,fetchrow_hashref的返回值是对哈希的引用,而不是哈希。对代码进行一些更改将使其正确:

    while ($ns2=$res2->fetchrow_hashref) {
        $nsips{$ns2->{nsid}}=$ns2->{nsip};
        $nsnames{$ns2->{nsid}}=$ns2->{nsname};
    }