gpt4 book ai didi

perl - 使用 Perl 计算消息中的字符频率

转载 作者:行者123 更新时间:2023-12-02 07:54:27 25 4
gpt4 key购买 nike

我正在编写一个 Perl 脚本来找出消息中字符出现的频率。这是我遵循的逻辑:

  • 使用 getc() 从消息中一次读取一个字符并将其存储到数组中。
  • 从索引 0 开始运行 for 循环,直到该数组的长度。
  • 此循环将读取数组的每个字符并将其分配给临时变量。
  • 运行另一个嵌套在上面的 for 循环,该循环将从正在测试的字符的索引运行到数组的长度。
  • 使用此字符与当前数组索引字符之间的字符串比较,如果它们相等,则计数器会递增。
  • 完成内部 For 循环后,我将打印字符的频率以进行调试。

问题:如果已经计算过字符的频率,我不希望程序重新计算该字符的频率。例如,如果字符“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";
}
}

最佳答案

你让你的生活变得比原本需要的更加困难。使用哈希:

my %freq;

while(defined($c = getc(INPUT)))
{
$freq{$c}++;
}

print $_, " ", $freq{$_}, "\n" for sort keys %freq;

$freq{$c}++ 递增存储在 $freq{$c} 中的值。 (如果未设置或为零,则变为一。)

打印行相当于:

foreach my $key (sort keys %freq) {
print $key, " ", $freq{$key}, "\n";
}

关于perl - 使用 Perl 计算消息中的字符频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7784414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com