メッセージ内の文字の出現頻度を調べる Perl スクリプトを作成しています。これが私が従っているロジックです:
- getc() を使用してメッセージから一度に 1 文字を読み取り、それを配列に格納します。
- インデックス 0 からこの配列の長さまで for ループを実行します。
- このループは、配列の各文字を読み取り、一時変数に割り当てます。
- 上記でネストされた別の for ループを実行します。これは、テスト対象の文字のインデックスから配列の長さまで実行されます。
- この文字と現在の配列インデックス char との間の文字列比較を使用して、それらが等しい場合はカウンターがインクリメントされます。
- 内側の For ループの完了後、デバッグ目的で char の頻度を出力しています。
質問: 文字の頻度が既に計算されている場合、プログラムで文字の頻度を再計算したくありません。たとえば、文字 "a" が 3 回出現する場合、最初の実行では正しい頻度が計算されます。ただし、次に "a" が出現すると、そのインデックスから最後までループが実行されるため、頻度は (実際の頻度 -1) になります。3 番目のオカレンスについても同様に、頻度は (実際の頻度 -2) です。
これを解決するには. 頻度がすでに評価されている文字をプッシュする別の一時配列を使用しました。
そして、次の for ループの実行時に、内側の 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";
}
}