2013-11-18 4 views
2

Мое намерение состоит в том, чтобы подсчитать количество слов в списке 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"; 
} 

Вся помощь приветствуется.

+1

Показать ваш ожидаемый результат. – toolic

+4

'for (my $ i = 0; $ i ikegami

ответ

3

Если я правильно понимаю вашу спецификацию правильно, вы просто хотите, чтобы переместить граф декларации/инициализации во внешнюю for цикла:

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

Это сбрасывает счетчик для каждой буквы.

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