【发布时间】:2013-01-15 13:43:43
【问题描述】:
目前我有一个 perl 脚本,它可以访问我们的数据库、执行某些查询并将输出打印到终端。相反,我想在生成 pdf 之前将结果输出到模板乳胶文件中。对于我的大多数查询,我提取数字并将它们存储为标量变量(例如,特定操作员执行给定任务的频率)。例如。
foreach $op (@operator) {
$query = "SELECT count(task_name) FROM table WHERE date <= '$date_stop' and
date >= '$date_start' and task=\'$operator[$index]\';";
#execute query
$result=$conn->exec($query);
$conres = $conn->errorMessage;
if ($result->resultStatus eq PGRES_TUPLES_OK) {
if($result->ntuples > 0) {
($task[$index]) = $result->fetchrow;
}
printf("$operator[$index] carried out task: %d\n", $task[$index]);
} else {
die "Failed.\n$conres\n\n";
exit -1;
}
$index++;
}
printf("**********************************\n\n");
在最终报告中,我将在表格中总结每个操作员完成每个任务的次数。除此之外,还有一些必须报告的事件。我可以使用诸如
之类的命令轻松地将这些打印到终端$query = "SELECT operator, incident_type from table_name WHERE incident_type = 'Y'
and date <= '$date_stop' and date >= '$date_start';";
$result=$conn->exec($query);
$conres = $conn->errorMessage;
if ($result->resultStatus eq PGRES_TUPLES_OK) {
if($result->ntuples > 0) {
$result->print(STDOUT, 1, 1, 0, 0, 0, 1, "\t", "", "");
}
} else {
die "Failed.\n$conres\n\n";
exit -1;
}
这个命令的输出示例是
operator | incident_type
-----------------------------
AB | Incomplete due to staff shortages
-------------------------------
CD | Closed due to weather
-----------------------------
如何让我的 perl 脚本将操作员名称和事件传递到字符串数组中,而不仅仅是将结果发送到终端?
【问题讨论】:
-
您在使用 DBI 模块吗?您也许应该指定。
-
看起来你甚至没有使用
strict,而且你使用了printf和exit错误。然后是毫无意义的\'和SQL 注入问题。这不让我想仔细看看。 -
Pg 模块似乎已有 13 年历史,可能不是最新的,尽管我认为它可能仍然有效。您的代码中有多个错误,所以我的建议是废弃它并重新开始,改用 DBI 模块。
-
@moadeep 你正在使用
printfprint就足够了(print "*****\n\n",print "$operator[$index] carried out task: $task[$index]\n");您正在使用带有可变格式字符串的printf(printf "$operator[$index] ...",格式字符串注入错误);exit(至少在 unixish 操作系统上)只取 0 到 255 之间的值(exit -1是无意义的)。如果你使用strict 'vars',那么你所有的变量都有一个太宽的范围(全局变量?)。你真的应该用use warnings; use strict;开始每个文件。 -
@melpomene 不要忘记在 for 循环中使用
$op,但要使用$operator[$index]来访问元素。而且在exit之前使用die也是一种毫无意义的练习。