我正在编写一个Perl脚本,用于查找消息中字符出现频率。以下是我遵循的逻辑:
- 使用getc()从消息中逐个读取字符,并将其存储到数组中。 - 运行一个for循环,从索引0到该数组的长度。 - 此循环将读取数组的每个字符并将其分配给临时变量。 - 运行另一个嵌套在上面的for循环,该循环将从正在测试的字符的索引运行到数组的长度。 - 通过字符串比较此字符和当前数组索引字符之间的差异,如果它们相等,则增加计数器。 - 完成内部For循环后,我会打印char的频率以进行调试。
问题:如果已经计算了字符的频率,则不希望程序重新计算它。例如,如果字符“a”出现3次,则对于第一次运行,它计算出正确的频率。但是,在下一个“a”的出现中,由于循环从该索引运行到结尾,因此频率为(实际频率-1)。对于第三次出现,频率为(实际频率-2)。
为解决这个问题,我使用了另一个临时数组来保存已经评估过频率的char。
然后,在下一次for循环运行之前,我将当前char与已评估char的数组进行比较并设置标志。基于该标志,运行内部for循环。
但是这对我没有起作用,结果仍然相同。
以下是我编写的代码以实现上述功能:
- 使用getc()从消息中逐个读取字符,并将其存储到数组中。 - 运行一个for循环,从索引0到该数组的长度。 - 此循环将读取数组的每个字符并将其分配给临时变量。 - 运行另一个嵌套在上面的for循环,该循环将从正在测试的字符的索引运行到数组的长度。 - 通过字符串比较此字符和当前数组索引字符之间的差异,如果它们相等,则增加计数器。 - 完成内部For循环后,我会打印char的频率以进行调试。
问题:如果已经计算了字符的频率,则不希望程序重新计算它。例如,如果字符“a”出现3次,则对于第一次运行,它计算出正确的频率。但是,在下一个“a”的出现中,由于循环从该索引运行到结尾,因此频率为(实际频率-1)。对于第三次出现,频率为(实际频率-2)。
为解决这个问题,我使用了另一个临时数组来保存已经评估过频率的char。
然后,在下一次for循环运行之前,我将当前char与已评估char的数组进行比较并设置标志。基于该标志,运行内部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";
}
}