如何在Perl中获取fetchall_arrayref foreach循环中数组的最后一个元素?
我将Perl与MySql结合使用。我有一个查询,我正在使用fetchall_arrayref从我的调查应用程序中获取结果数据。根据文档的建议,我使用foreach循环访问fetchall_arrayref。在这个循环中,我循环我的$answer1数据并运行计数器来计算一个问题的所有答案,我想要总数。当我将此信息推入数组并尝试获取该数组中的最后一个元素时,我无法获得所需的输出。我在fetchall_arrayref foreach循环之外运行了一个测试,使用了相同的逻辑,它成功地满足了我的需要 这是我的密码:如何在Perl中获取fetchall_arrayref foreach循环中数组的最后一个元素?,perl,dbi,Perl,Dbi,我将Perl与MySql结合使用。我有一个查询,我正在使用fetchall_arrayref从我的调查应用程序中获取结果数据。根据文档的建议,我使用foreach循环访问fetchall_arrayref。在这个循环中,我循环我的$answer1数据并运行计数器来计算一个问题的所有答案,我想要总数。当我将此信息推入数组并尝试获取该数组中的最后一个元素时,我无法获得所需的输出。我在fetchall_arrayref foreach循环之外运行了一个测试,使用了相同的逻辑,它成功地满足了我的需要 这
my $testQuery = "SELECT questionNum, question, answer1 FROM results WHERE title = ? ORDER BY questionNum";
my $sty = $dbh->prepare($testQuery);
$sty->execute($marathon);
my $potential = $sty->fetchall_arrayref();
$sty->finish;
my $previous_question;
my $previous_answer;
my $countEm;
my @total;
my @totalAnswer;
my @norm;
my $last_arr_index;
foreach my $data (@$potential) {
my ($questionNumber, $question, $answer1) = @$data;
$answeredOne = 0;
print qq{<tr><td>$questionNumber. $question</td></tr>} unless $previous_question eq $question;
if ($answer1 ne "" && $questionNumber == 1){
$optionOne = $answer1;
$answeredOne = $answeredOne + 1;
$countEm++;
push @total, $countEm;
push @totalAnswer, $optionOne;
}
if ($answeredOne != 0){
#my $elementCount = scalar(@total);
#say $elementCount;
say @total[-1];
}
$previous_question = $question;
$previous_answer = @totalAnswer[2];
}#end foreach
“说总数[-1];”给我“5”
为什么在fetchall_arrayref中不起作用?您的第一个代码片段相当于
my$counting;
我的@totalCounting;
我的@link=('water','water','water','water','water');
foreach my$i(@link){
$counting++;
按@totalCounting,$counting;
说@totalCounting[-1];
}
如果你想在循环之后做一些事情,把它放在循环之后,而不是放在它将被执行多次的地方
使用数组只使用其最后一个元素的整个概念是有缺陷的。更简单,最后浪费:
my@link=('water','water','water','water','water','water');
我的美元计数;
我的$i(@link){
$counting++;
}
说美元计数;
(当然,您可以在这里简单地使用比如说0+@link;
,但可以理解,这段代码是一个更大片段的代理,其中计数是有条件的。)
有没有办法获取fetchall_arrayref中的最后一个元素
$total[-1]
(因此@total[-1]
)是@total
的最后一个元素
这是目前存在的最后一个元素。显然,您无法获得尚未放入@total
的元素。但这听起来正是你想要做的。如果在循环完成之前需要总计,则需要在需要之前进行计算
my$total;
对于我的$数据(@$潜在){
我的($questionNumber,$question,$answer1)=@$数据;
如果($answer1 ne”“&&$questionNumber==1){
$total++;
}
}
对于我的$数据(@$潜在){
我的($questionNumber,$question,$answer1)=@$数据;
#做一些使用$total的事情。。。
}
在一种情况下,在循环中打印总计。在另一种情况下,如果你只想做一次,就不要把它放在循环中!使用@total
的整个想法是有缺陷的。最后的计数是您想要的,当您使用“@foo”
将数组插入到字符串中时,$countEm
中已经有了这一点,它将用空格连接值(实际上,$,
)。这里您没有这样做,但是您应该看到最后一个值3
,并警告应该写入$total[-1]
@ikegami我使用“@total”,因为我无法从$countEm中获取最后一个元素(3)。有没有其他方法可以在不将$countEm放入数组的情况下获取其最后数量?@simbabque-Hey。我也试过$total[-1],但我仍然得到:1233的打印。我不明白。啊,我现在明白你的意思了。谢谢你把它画出来$answer1是10个答案中的一个,$answer10是一个需要无限制问题结果的程序中最高的。因此,对于许多问题,每个问题我可能要做10次。我觉得这会变得一团糟。在Perl中,有没有一种更干净的方法可以基于某些条件从数据库中获取变量总数?我认为您正在寻找+$totals[$question\u num]
或+$totals{$question\u num}
如果有,那么可以让数据库使用分组方式和求和为您完成这项工作。而且速度也会更快。请随意提问,但要清楚您的数据是什么样的,以及您希望从中得到什么。谢谢,在我尝试使用GROUP BY之前,我将对此进行调查。我应该包括更多的信息。GROUP BY不起作用的原因是,对于某些问题,有多个答案的复选框答案,GROUP BY会将它们放在一起。例1。你今天过得怎么样?好的坏的好的在我的结果页面上使用分组方式将显示:1。你今天过得怎么样?好:4好/坏:3坏:3当我需要每个答案的完整总数时,没有组合。因此,我需要的是:好:7,而不是在两个选项之间分开。此外,我试图给你投票,但我在这里太新了,没有关系。
my $counting;
my @totalCounting;
my @link = ('water', 'water', 'water', 'water', 'water');
foreach my $i (@link){
$counting++;
push @totalCounting, $counting;
}
say @totalCounting[-1];