Я пишу Perl Script, чтобы узнать частоту появления символов в сообщении.Вот логика, которой я придерживаюсь:
- Читайте по одному символу за раз из сообщения с помощью getc () и сохраняйте его в массив.
- Запуск цикла for, начиная с индексаОт 0 до длины этого массива.
- Этот цикл будет считывать каждый символ массива и присваивать ему временную переменную.
- Запускать другой цикл, вложенный в приведенный выше цикл, который будет выполняться изиндекс тестируемого символа до длины массива.
- Используя сравнение строк между этим символом и текущим массивом, индексированным символом, счетчик увеличивается, если они равны.
- После завершения внутреннего цикла, я печатаю частоту символав целях отладки.
Вопрос: Я не хочу, чтобы программа пересчитывала частоту символа, если она уже была вычислена.Например, если символ «а» встречается 3 раза, то при первом запуске вычисляется правильная частота.Однако при следующем появлении «a», поскольку цикл выполняется от этого индекса до конца, частота равна (фактическая частота -1).Аналогично для третьего случая частота (фактическая частота -2).
Чтобы решить эту проблему.Я использовал другой временный массив, в который я помещал бы символ, частота которого уже была оценена.
И затем при следующем запуске цикла for перед входом во внутренний цикл for я сравниваю текущий символ с массивомоценил символы и установил флаг.На основании этого флага запускается внутренний цикл for.
Это не работает для меня.Все те же результаты.
Вот код, который я написал для достижения вышеупомянутого:
#!/usr/bin/perl
use strict;
use warnings;
my $input=$ARGV[0];
my ($c,$ch,$flag,$s,@arr,@temp);
open(INPUT,"<$input");
while(defined($c = getc(INPUT)))
{
push(@arr,$c);
}
close(INPUT);
my $length=$#arr+1;
for(my $i=0;$i<$length;$i++)
{
$count=0;
$flag=0;
$ch=$arr[$i];
foreach $s (@temp)
{
if($ch eq $s)
{
$flag = 1;
}
}
if($flag == 0)
{
for(my $k=$i;$k<$length;$k++)
{
if($ch eq $arr[$k])
{
$count = $count+1;
}
}
push(@temp,$ch);
print "The character \"".$ch."\" appears ".$count." number of times in the message"."\n";
}
}