Perl : 8 ~ 10 개의 고유 문자
s/// 솔루션 : 10 개, 13 개
sed 기술은 항상 perl에서도 작동하며 고유 한 문자의 이름 수를 산출합니다 (10).
s/[aeiou]//gi
예를 들면 다음과 같습니다.
$ echo 'This program will remove VOWELS. So we can speak without them.' |
perl -ple 's/[aeiou]//gi'
Ths prgrm wll rmv VWLS. S w cn spk wtht thm.
이것이 증명하는 것처럼 10 개의 구별되는 문자입니다.
$ echo 's/[aeiou]//gi' | perl -nle '@s{split//}=(); print scalar keys %s'
10
sed의 솔루션의 문제점은 그것이다 /i이다 하지 나오지 POSIX의 일부, 따라서 휴대용 아니다 :
$ echo 'This program will remove VOWELS. So we can speak without them.' |
sed -e 's/[aeiou]//gi'
sed: 1: "s/[aeiou]//gi": bad flag in substitute command: 'i'
OpenBSD 시스템에서 실행 중입니다. 반면에, 때문에 /i표준 펄의 일부는, 당신은 항상 참으로 수 항상 거기에 있다고 믿을 . sed와 달리.
모음 목록에 "y"를 포함 시키려면 동일한 기술을 사용하면 물론 더 큰 것입니다.
$ echo 'This nifty program remove any VOWELS. So we easily can speak without them.' |
perl -ple 's/[aeiouy]//gi'
Ths nft prgrm rmv n VWLS. S w sl cn spk wtht thm.
$ echo 's/[aeiouy]//gi' | perl -nle '@s{split//}=(); print scalar keys %s'
11
그리고 이제 총 14 자입니다.
tr[][] 솔루션 : 8 개의 고유 한 10 개의 총계
tr///일치 하는 것을 제거 하는 데 사용할 수도 있습니다 . 펄은 sed의 y///별칭을 사용할 수도 있습니다 tr.
y/aeiou//d
이제 8 개의 고유 한 문자이지만 대문자에서는 작동하지 않습니다. 케이스 맵에 대처하기 위해 5자를 더 추가해야합니다.
$ echo 'y/aeiouAEIOU//d' | perl -nle '@s{split//}=(); print scalar keys %s'
13
물론 지금은 총 15입니다.
그러나 모음으로 믹스에 "y"를 추가해도 s///버전에서 와 같이 고유 문자 수가 증가하지 않습니다 .
$ echo 'This nifty program remove any VOWELS. So we easily can speak without them.' |
perl -ple 'y/aeiouy//d'
Ths nft prgrm rmv n VOWELS. S w sl cn spk wtht thm.
그래서 그것은 여전히 11 개의 총합 중 8 개의 독창적입니다.
$ echo 'y/aeiouy//d' | perl -nle '@s{split//}=(); print scalar keys %s'
8
편집 : 분음 부호 회계
그리고 같은 입력은 Renée’s naïveté어떻습니까? 올바른 출력은 물론이어야 Rn’s nvt합니다. v5.14의 /r플래그를 사용하여이를 수행하는 방법은 다음과 같습니다 s///.
$ echo 'Renée’s naïveté' |
perl5.14.0 -CS -MUnicode::Normalize -nle 'print NFD($_)=~s/[aeiou]\pM*//rgi'
Rn’s nvt
27 개의 고유 한 문자입니다.
$ echo 'print NFD($_) =~ s/[aeiou]\pM*//rgi' |
perl -nle '@s{split//}=(); print scalar keys %s'
27
당신이 스와핑에 의해 적어도 V5.10에서 실행하고 있음을 보장 할 수있는 경우는 26에 그 트리밍 할 수 printA의를 say:
$ echo 'Renée’s naïveté' |
perl -Mv5.14 -CS -MUnicode::Normalize -nlE 'say NFD($_) =~ s/[aeiou]\pM*//rgi'
Rn’s nvt
$ echo 'say NFD($_) =~ s/[aeiou]\pM*//rgi' |
perl -nle '@s{split//}=(); print scalar keys %s'
26
분음 부호를 제거하는 대신 이동하는 것이 마음에 들지 않으면 22로 줄일 수 있습니다.
$ echo 'Renée’s naïveté' |
perl -Mv5.14 -CS -MUnicode::Normalize -nlE 'say NFD($_) =~ s/[aeiou]//rgi'
Rń’s n̈vt́
어느입니다 ... 재미 , 보는 달랐어 요. :) 여기에 고유 카운트가 있습니다.
$ echo 'say NFD($_) =~ s/[aeiou]//rgi' |
perl -nle '@s{split//}=(); print scalar keys %s'
22
이보다 적은 수의 문자를 사용하여 분음 부호를 올바르게 처리하기 위해 다른 언어를 사용하는 것이 좋습니다.