귀하의 질문은 귀하의 해시에서 5 개의 가장 높은 값을 얻는 방법입니다. 당신은이 부호가있다 :
my @keys = sort {
$words{$b} <=> $words{$a}
or
"\L$a" cmp "\L$b"
} keys %words;
당신이 당신의 분류 한 해시 열쇠가있는 곳에. 거기에서 5 개의 탑 키를 가져 가라.
my @highest = splice @keys, 0, 5; # also deletes the keys from the array
my @highest = @keys[0..4]; # non-destructive solution
또한 코드에 대한 몇 가지 의견 :
open(my $filehandle0, '<', $file0) || die "Could not open $file0\n";
오픈이 실패한 이유에 대한 귀중한 정보를 얻을 수 있도록 다이 문에서 오류 메시지 $!
을 포함하는 것이 좋습니다.
for (@words) {
s/[\,|\.|\!|\?|\:|\;|\"]//g;
}
내가 코멘트에서 말했듯이, 당신은 문자 클래스를 대문자로 이스케이프하거나 교대를 사용할 필요가 없습니다. 다음 중 하나를 사용하십시오.
s/[,.!?:;"]//g for @words; #or
tr/,.!?:;"//d for @words;
다음 부분은 약간 이상합니다.
my @stopwords;
while (my $line = <$filehandle1>) {
chomp $line;
my @linearray = split(" ", $line);
push(@stopwords, @linearray);
}
for my $w (my @stopwords) {
s/\b\Q$w\E\B//ig;
}
당신은 파일에서 중지 단어를 읽을 ... 그리고 당신은 $_
에서 중지 단어를 삭제 하시겠습니까? 이 시점에서 $_
도 사용하고 계십니까? 또한 루프 헤더에 @stopwords
배열을 다시 선언하면 새 배열이 비어 있음을 의미하므로 루프가 실행되지 않습니다. 이 오류는 침묵입니다. 그래서 눈치 채지 못할 수도 있습니다.
my %words = %words_count;
여기 당신은 다시 사용하지 않을 때문에, 중복 것 같다
%words_count
의 사본을 확인하십시오. 큰 해시를 사용하면 성능이 저하 될 수 있습니다.
my $key_count = 0;
$key_count = keys %words;
이것은 한 줄로 이루어질 수 있습니다 : my $key_count = keys %words
. 내 의견으로는 더 읽기 쉽습니다.
$value_count = $words{$key} + $value_count;
도 +=
연산자로 축약 할 수있다 : 당신이 엄격하고 경고를 사용하는 것이 매우 좋은 $value_cont += $words{$key}
.
코드를 표시하십시오. – edem
''내가 분류 한 해시가 있습니다 .. ''아니오. 해시를 분류 할 수 없습니다. – TLP
아니, 내가 순서대로 인쇄했음을 의미하지만 상위 5 위를 차지하려고한다. –