【问题标题】:How can I get the last element of an array inside of my fetchall_arrayref foreach loop in Perl? [duplicate]如何在 Perl 的 fetchall_arrayref foreach 循环中获取数组的最后一个元素? [复制]
【发布时间】:2021-06-20 09:29:36
【问题描述】:

我将 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

当我打印时:“说@total[-1];”当我只需要“3”时,给我“1 2 3”的输出。

我在 fetchall_arrayref foreach 循环之外测试了同样的逻辑,我得到了想要的输出:

my $counting;
my @totalCounting;
my @link = ('water', 'water', 'water', 'water', 'water');
foreach my $i (@link){
    $counting++;
    push @totalCounting, $counting;
}
say @totalCounting[-1];

"说总计数[-1];"给我“5”。

为什么这在 fetchall_arrayref 中不起作用?

【问题讨论】:

  • 在一种情况下,您循环打印总计。另一种情况,你不要如果你只想做一次,不要把它放在一个循环中!
  • 使用@total 的整个想法是有缺陷的。最后的计数就是你想要的,这已经在$countEm
  • 当您使用"@foo" 将数组插入字符串时,它将用空格连接值(实际上是$,)。您没有在此处执行此操作,但您应该看到最后一个值 3 并警告它应该写成 $total[-1]
  • @ikegami 我使用“@total”,因为我无法从 $countEm 中获取最后一个元素 (3)。有没有另一种方法可以在不将它们放入数组的情况下获取 $countEm 的最后一个数字?
  • @simbabque 嘿。我也尝试了 $total[-1] 并且仍然得到: 1 2 3 打印。我不明白。

标签: perl dbi


【解决方案1】:

你的第一个 sn-p 相当于

my $counting;
my @totalCounting;
my @link = ('water', 'water', 'water', 'water', 'water');
foreach my $i (@link){
    $counting++;
    push @totalCounting, $counting;
    say @totalCounting[-1];
}

如果你想在循环之后做一些事情,把它放在循环之后,而不是在它会被多次执行的地方。


使用数组仅使用其最后一个元素的整个概念是有缺陷的。更简单,最后浪费:

my @link = ('water', 'water', 'water', 'water', 'water');

my $counting;
for my $i (@link) {
    $counting++;
}

say $counting;

(当然,您可以在这里简单地使用say 0+@link;,但据了解,此代码是更大的sn-p的代理,其中计数是有条件的。)


有没有办法获取 fetchall_arrayref 中的最后一个元素?

$total[-1](因此@total[-1]@total的最后一个元素。

嗯,它是当前存在的最后一个元素。您显然无法获得尚未放入 @total 的元素。但这正是你想要做的。如果在循环完成之前需要总数,则需要在需要之前计算它。

my $total;
for my $data (@$potential) {
    my ($questionNumber, $question, $answer1) = @$data;
    if ($answer1 ne "" && $questionNumber == 1) {
        $total++;
    }
}

for my $data (@$potential) {
    my ($questionNumber, $question, $answer1) = @$data;
    # Do something that uses $total...
}

【讨论】:

  • 啊,我明白你的意思了。谢谢你把它画出来。 $answer1 是 10 个之一,$answer10 是最高的 在一个需要无限制问题结果的程序中。因此,对于许多问题,我可能必须对每个问题执行 10 次此操作。我觉得这可能会变得混乱。有没有一种更简洁的方法可以根据 Perl 中的某些条件从数据库中获取变量总数?
  • 我认为您正在寻找++$totals[$question_num]++$totals{$question_num}
  • 如果是这样,那么可以,您可以让数据库使用GROUP BYSUM 为您执行此操作。而且它也会更快。随意提出一个问题,但要清楚你的数据是什么样的以及你想从中得到什么。
  • 谢谢,我会调查这一切,尽管在此之前我尝试使用 GROUP BY。我应该包含更多信息。 GROUP BY 不起作用的原因是因为对于某些问题,有多个答案的复选框答案,并且 GROUP BY 会将它们放在一起。前任。 1. 你今天过得怎么样?好不好,在我的结果页面上使用 GROUP BY 会显示: 1. 你今天过得怎么样?好:4 好/坏:3 坏:3 当我需要每个答案的完整总数时,没有组合。因此,我需要 good to be: good: 7 而不是在两个选项之间分开。
  • 另外,我想给你投票,但我太新了,没关系。
猜你喜欢
  • 2014-03-17
  • 2019-10-22
  • 2018-11-03
  • 2014-03-20
  • 2013-10-16
  • 2015-08-23
  • 2011-07-03
  • 2015-07-25
  • 2013-05-17
相关资源
最近更新 更多