Perl에서 문자열을 배열 해싱으로 구현하는 방법은 무엇입니까?

Perl에서 문자열을 배열 해싱으로 구현하는 방법은 무엇입니까?

특정 입력 줄에서 각 단어의 발생 횟수를 계산하려고 합니다. 주어진 예(내가 달성하고 싶은 것):

$./foo.pl
asd fgh
asd iop
zxc

asd: 1, 2
fgh: 1
iop: 2
zxc: 3

단어가 어느 줄에 나타나는지 기록하는 프로그램입니다. 이 스크립트는 다음과 같습니다.

#!/usr/bin/perl -w
while(<>){
    ++$line_num;
    @words = split $_;
    for my $w(@words){
        push @h{$w}, $line_num;
    }
}
for my $k(keys %h){
    print "$k:\t";
    print "@h{$k}\n";
}

오류가 발생합니다.

Experimental push on scalar is now forbidden

하지만 @h{$w}키가 단어(문자열)이고 값이 스칼라가 아닌 배열인 해시입니다. 그렇다면 왜 이런 오류가 발생하는 걸까요?

답변1

에서 언급했듯이Rakesh Sharma의 댓글, 액세스 구문익명 배열해시의 요소는 입니다 @{ $h{$w} }. 예를 들어:

#!/usr/bin/perl -w

while(<>){
    for my $w (split) {
        push @{ $h{$w} }, $.;
    }
}
for my $k (keys %h) {
    print "$k:\t", "@{ $h{$k} }\n";
}

예시 보기

답변2

나는 Perl을 사용한 적이 없지만 온라인에서 본 바에 따르면 코드의 4번째 줄에 대해 다음을 수행할 필요가 없습니다 @words = split(' ', $_); . @words = split;

어쩌면 이것을 시도해보십시오:

while (<>){
  ++$line_num;
  for $w (split){              #Changed this
    push @{$h{$w}}, $line_num;  #Changed this
  }
}

관련 정보