Perl 嵌套循环-为什么循环包含上一个计算?

Perl 嵌套循环-为什么循环包含上一个计算?,perl,nested-loops,repeat,Perl,Nested Loops,Repeat,我的目的是计算清单2中包含清单1中每个字母的单词数。 当我运行代码时,第一次计数很好;但是,随后的计数被添加到之前的计数中,因此最终计数是所有计数的总和,而不是我希望的包含“F”的“单词”的数量的计数。 我哪里做错了 这是我的密码 use warnings; use strict; my $count=0; my @list1 = ("A", "B", "C", "D", "E", "F"); my @list2 = ("AXE", "DOG", "CAT", "FOOD", "TRANC

我的目的是计算清单2中包含清单1中每个字母的单词数。 当我运行代码时,第一次计数很好;但是,随后的计数被添加到之前的计数中,因此最终计数是所有计数的总和,而不是我希望的包含“F”的“单词”的数量的计数。 我哪里做错了

这是我的密码

use warnings; use strict;


my $count=0;
my @list1  = ("A", "B", "C", "D", "E", "F");
my @list2 = ("AXE", "DOG", "CAT", "FOOD", "TRANCE");

for (my $i=0; $i<scalar(@list1); $i++){ 
    for (my $j=0; $j<scalar(@list2); $j++){
        my $word = $list2[$j];  
        my $letter = $list1[$i];

        if ($word =~ /$letter/){
            $count++;
        }
    }   
    print "$count \n";
}
使用警告;严格使用;
我的$count=0;
my@list1=(“A”、“B”、“C”、“D”、“E”、“F”);
my@list2=(“斧头”、“狗”、“猫”、“食物”、“恍惚”);

对于(my$i=0;$i如果我正确理解了您的规范,您只需要将计数声明/初始化移动到外部
for
循环中:

for ( my $i = 0 ; $i < scalar(@list1) ; $i++ ) {
    my $count = 0;
for(my$i=0;$i

这将重置每个字母的计数。

如果我正确理解您的规范,您只需将计数声明/初始化移动到外部
for
循环:

for ( my $i = 0 ; $i < scalar(@list1) ; $i++ ) {
    my $count = 0;
for(my$i=0;$i

这将重置每个字母的计数。

如上所述,您只需重置计数器变量即可获得正确的结果

但是,通过使用grep而不是嵌套循环,您确实可以简化代码

#!/usr/bin/perl

use warnings;
use strict;

my @list1 = qw( A B C D E F );
my @list2 = qw( AXE DOG CAT FOOD TRANCE );

# Iterate over the letter array, using grep to count how many times 
# it shows up in each word, and then store that result to a hash
my %result;
for my $letter ( @list1 ) {
    my $count = grep { $_ =~ /$letter/ } @list2;
    $result{$letter} = $count;
}

# Now print out all of the results
print "Number of words found for each letter:\n";
for ( sort keys %result ) {
    print "$_: $result{$_}\n";
}
根据您的测试数据,我得到以下结果:

Number of words found for each letter:
A: 3
B: 0
C: 2
D: 2
E: 2
F: 1

如上所述,您只需重置计数器变量即可获得正确的结果

但是,通过使用grep而不是嵌套循环,您确实可以简化代码

#!/usr/bin/perl

use warnings;
use strict;

my @list1 = qw( A B C D E F );
my @list2 = qw( AXE DOG CAT FOOD TRANCE );

# Iterate over the letter array, using grep to count how many times 
# it shows up in each word, and then store that result to a hash
my %result;
for my $letter ( @list1 ) {
    my $count = grep { $_ =~ /$letter/ } @list2;
    $result{$letter} = $count;
}

# Now print out all of the results
print "Number of words found for each letter:\n";
for ( sort keys %result ) {
    print "$_: $result{$_}\n";
}
根据您的测试数据,我得到以下结果:

Number of words found for each letter:
A: 3
B: 0
C: 2
D: 2
E: 2
F: 1
for(my$i=0;$i
for(my$i=0;$i