perl脚本使用未初始化的值错误

时间:2013-07-08 14:02:13

标签: perl

我有这个改变MySQL数据库数据的perl脚本,每次运行它都会出现以下错误

 Use of uninitialized value in addition (+) at ./cdr_db.pl-m line 88.

查看第80到88行的代码

### archive cdr records
    $sth = $dbh2->prepare(
        "SELECT max($tablename2_archive.EventID) from $tablename2_archive")
      or die "Couldn't prepare statement: " . $dbh->errstr;
    $sth->execute()
      or die
"Database error trying to poll $tablename2_archive.EventID for archive use: "
      . $sth->errstr . "\n";
    my $nextEventID = $sth->fetchrow_array + 1;

这是完整的脚本

http://pastebin.com/4hmaS3b9

我只是不知道错误是什么。

1 个答案:

答案 0 :(得分:3)

fetchrow_array返回值的列表,如果没有更多行要提取,则为空。

在列表中添加一个是错误的Perl样式,但它具有使用列表的 last 元素的效果,这是您想要的,因为应该只有一个返回值。

目前,fetchrow_array可以返回空列表或以undef结尾的列表。在添加中,两者都将评估为undef。第一个是最有可能的,我猜你正在尝试将记录添加到空表中,而之前没有EventID列?

你应该写

$sth->execute;
my @row = $sth->fetchrow_array;
die "No results returned" unless @row;
my $nextEventID = $row[0] + 1;

或者绑定要提取的列会更好(并且更快,更合适)

my $eventID;

$sth->execute;
$sth->bind_columns(\$eventID);
$sth->fetch;
die "No results returned" unless defined $eventID;
my $nextEventID = $eventID + 1;

但在进行算术运算之前,您仍需检查$eventID是否为undef

最后。抱歉,这是如此冗长,你应该EventIDNOT NULL,以便确保undef的值表示没有找到任何行,你应该使用MySQL AUTO_INCREMENT列属性,以便您不必自己计算ID。声明看起来像

EventID INT NOT NULL AUTO_INCREMENT

,当您编写INSERT INTO时,您只需省略该列的值。

我希望这会有所帮助。