【问题标题】:Compare values in an array比较数组中的值
【发布时间】:2015-07-10 10:39:40
【问题描述】:

我正在使用 perl 处理返回多个结果的数据库查询,如下所示:

select name,percent from table order by percent desc

我只想检索 if 条件中的那些值,如以下代码所示:

while (@data=$sth->fetchrow_array()) {
    $toto = $data[0];
    $percent = $data[1];
    foreach $percent (@data) {
        if ($percent > 80) {
            $output .= $toto.'='.$percent.'%,';
            $state = "BAD";
        }
        elsif ($percent > 60 && $percent < 80){
            $output .= $toto.'='.$percent.'%,';
            $state = "NOTGOOD";
        }
    }
}
my $str = "$state $output";
# Display Ouptut
print $str."\n";
undef($str);

exit $ERRORS{$status};

这段代码只打印最后一条语句(NOTGOOD);我想为每个缺失值打印BAD

这是查询的结果:

test 40
test2 80
test3 75
test4 90
test5 50
test6 45

这里是打印输出:

NOTGOOD test4=90%,test2=80%,test3=75%,

所有值都很好但状态错误

【问题讨论】:

  • 始终使用严格。你在哪里打印 $output 和 $state?
  • $opt_c 和 $opt_w 是数字,而 opt_w 小于 opt_c,我认为问题出在循环外打印。我要改了
  • 我在最后打印 $output 和 $state
  • 好的。那么给定这个输入,你到底想要什么输出?

标签: arrays perl dbi


【解决方案1】:

你的逻辑在这里很奇怪。但是因为不清楚你想做什么,所以我不可能为你解决它。不过,我希望能解释一下你当前的代码在做什么,希望你能弄清楚如何修复它。

假设您的查询返回以下数据:

  • 姓名、百分比
  • 约翰,100
  • 保罗,75 岁
  • 乔治,50
  • 林戈,25

现在让我们逐行逐行浏览您的代码。

while (@data=$sth->fetchrow_array()) {

此时,@data 包含“John”和“100”。

$toto = $data[0];
$percent = $data[1];

这会将“John”放入$toto,将“100”放入$percent

foreach $percent (@data) {

这很奇怪。它遍历@data,将每个元素依次放入$percent。因此,在第一次迭代中,$percent 被设置为“John”(覆盖您之前放置的“100”。

    if ($percent > $opt_c) {

我不知道$opt_c 包含什么。假设它是 50。但$percent 包含“John”——这不是一个数字。如果你打开了use warnings(你真的应该打开),那么当你试图与不是数字的东西进行数字比较时,Perl 会在此时给你一个警告。但是 Perl 会将您的非数字转换为 0 并进行比较。 0 不大于 50,所以会执行 else 分支。

        $output .= $toto.'='.$percent.'%,';
        $state = "BAD";
    }
    elsif ($percent > $opt_w && $percent < $opt_c){

再说一次,我不知道$opt_w 是什么。假设它是 25。但$percent 在被视为数字时仍然为 0。所以这段代码也不会被执行。

        $output .= $toto.'='.$percent.'%,';
        $state = "NOTGOOD";
    }
}

}

下一次循环你的内部循环,$percent 设置为 100。所以你的 if 代码被执行,$outer 设置为“John=100%”。并且$state 设置为“BAD”。但是您永远不会对 $state 做任何事情,因此它会在下一次围绕您的外部 (while) 循环时被覆盖。

您的foreach $percent (@data) 线路非常可疑。我真的不确定你想在那里做什么。而您只看到一个 $state 的原因是因为您(可能)在循环之外打印它并且只看到它设置为的最终值。

打开use strictuse warnings 总是一个好主意。然后修复他们将向您显示的错误。

【讨论】:

  • 我使用严格和警告,我没有任何错误
  • 那么我非常怀疑您正在运行您在此处向我们展示的代码。
  • 运行您的代码时,我收到警告,例如“参数“测试”在数字 gt (>) 中不是数字”。我不知道你是怎么看不到这些警告的。
  • 我的错误我删除了使用警告,我得到了同样的错误......如何摆脱它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 2015-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多