【发布时间】:2011-10-16 12:58:48
【问题描述】:
我正在编写一个 Perl 脚本来找出消息中字符出现的频率。这是我遵循的逻辑:
- 使用 getc() 从消息中一次读取一个字符并将其存储到数组中。
- 从索引 0 开始到该数组的长度运行一个 for 循环。
- 此循环将读取数组的每个字符并将其分配给一个临时变量。
- 运行另一个嵌套在上面的 for 循环,它将从被测试字符的索引开始运行,直到数组的长度。
- 使用此字符与当前数组索引字符之间的字符串比较,如果它们相等,则计数器会增加。
- 内部 For 循环完成后,我正在打印 char 的频率以进行调试。
问题:我不希望程序重新计算已经计算过的字符的频率。例如,如果字符“a”出现 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";
}
}
【问题讨论】:
标签: perl frequency-analysis getc