특정 입력 줄에서 각 단어의 발생 횟수를 계산하려고 합니다. 주어진 예(내가 달성하고 싶은 것):
$./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
}
}