저는 Perl을 처음 접했습니다. 배열을 추출하여 아래 열에 인쇄해야 합니다. 까다로운 부분은 각 단어가 서로 다른 소리 유형(P 또는 S로 지정)을 갖고 있고 각 유형이 해당 소리 및 음절 모양과 연관되어 있다는 것입니다.
array[]를 사용하여 추출해 보았지만 코드가 꽤 깁니다. 이것을 인코딩하는 더 효율적인 방법이 있습니까?
입력(데이터는 celex corpus에 있음). 다음은 수천 줄에 대한 예입니다.
31259\open\635\3\P\5-p@n\[VV][CVC]\[@U][p@n]\P\5-pH\[VV][CS]\[@U][pn,]\S\5-pF\[VV][CS]\[@U][pm,]
........
........
내 출력은 다음과 같아야 합니다.
WordForm Frequency Type Pronunciation SyllableShape
open 635 P. [@U] [p@n] [VV] [CVC]
open 635 P. [@U] [pn,] [VV] [CS]
open 635 S [@U] [pm,] [VV] [CS]
...
...
답변1
.
그 뒤에 가 있는지 확인하는 방법을 모르지만 P
이것이 4개의 요소 그룹과 5개의 요소 헤더라고 가정하면 awk
솔루션은 어떻습니까?
awk -F '\' 'BEGIN{ print "WordForm Frequency Type Pronunciation Syllableshape"}{
for (i=5;i<=NF;i+=4) print $2, $3, $i, $(i+3), $(i+2)
}' file | column -t
산출
WordForm Frequency Type Pronunciation Syllableshape
open 635 P [@U][p@n] [VV][CVC]
open 635 P [@U][pn,] [VV][CS]
open 635 S [@U][pm,] [VV][CS]
편집하다
아래 게시물에 따라, 그리고 단지 재미를 위해(어제 밤 이전에는 스크립팅 목적을 고려한 적이 없었기 때문에 ) 작동하는 것처럼 보이는 스크립트에 perl
위의 루프를 입력했습니다 . perl
아래 내용은 아무런 지식도 없이 처음부터 짜맞추어 만든 것이기 때문에 오류가 많을 것이라 확신합니다. 따라서 이것이 정말 나쁜 코딩이라면 논평하거나 비판하지 말고 교육을 위해 올바른 방법을 게시하십시오.
#!/bin/perl
open(my $filehandle, '<', './file')
or die "Unable to open file, $!";
print "WordForm Frequency Type Pronunciation Syllableshape\n";
while (<$filehandle>) {
chomp($_);
@c = split (/\\/, $_);
for ($i=4;$i<=(@c-4);$i+=4) {
print "@c[1] @c[2] @c[$i] @c[$i+3] @c[$i+2]\n";
}
print "\n";
}
close($filehandle)
or warn "Unable to close the file handle: $!";
답변2
Perl 스크립트를 약간 단순화했습니다. 이 "스크립트"는 를 호출하는 데 사용할 수 있습니다 perl script file
.
print "WordForm Frequency Type Pronunciation Syllableshape\n";
while (<>) {
chomp;
@c = split(/\\/);
for ($i=4; $i<$#c; $i+=4) {
print "$c[1] $c[2]";
print " $c[$i] $c[$i+3] $c[$i+2]\n";
}
}
$i<$#c;
대신에 $i<@c-4;
나는 "보안"에서 4를 뺀 값을 뺐습니다(기록이 깨진 경우에만 중요함).
$#c
@c
스칼라 값 배열, 즉 마지막 인덱스입니다.
awk()와의 유일한 차이점은 첫 번째 요소가 Perl에 있다는 i=5
것입니다 .$i=4
$c[0]