2009-12-03 5 views
3

Perl의 y 연산자는 문자 별 문자 변환을 수행합니다. 예를 들어 y/abc/dfg를 "foobar"문자열로 사용하면 "foofdr"이됩니다. 그러나 "ā"를 "ei"로, "ä"를 "a :", "ō"를 "әu"및 "o"에서 "ɒ"로 음역하고 싶다면 어떻게해야할까요? y 연산자를 사용하여 Perl에서 일대일 음역을 수행 할 수 있습니까?

나는

y/āäōo/(ei)(a:)(әu)ɒ/ 

는 우리가 잘하면이 문제에 대한 해결 방법이 있나요? 아니면 반복의 연산자를 사용하고 성가신 대체를 많이해야합니까 다음 코드 줄하지만 행운을 :(시도 ?

덕분에 어떤 지침 :)

+1

사용하려는 도구가 필요한 기능을 수행하지 못하면 다른 도구를 찾으십시오. y ///는 일대일 음역입니다. –

+0

@ 브라이언, 코멘트 주셔서 감사합니다. y 연산자의 일대일 제한을 변경할 수 있다고 생각했습니다. 내 바보 같아. – Mike

답변

14

이 경우에 사전에 해시를 생성하고 쉽게 문자열로 키에서 이동합니다. 당신의 키 길이를 줄이고 대신 [ ](| |)를 사용하여 가입 순서에 따라 하나 개 이상의 문자 긴 키를 정렬하여 경우

use warnings; 
use strict; 
use utf8; 
binmode STDOUT, ":utf8"; 
my $string = "āäōo"; 
my %trans = qw/ā ei ä a: ō u o ɒ/; 
my $keys = join '', keys %trans; 
$string =~ s/([$keys])/$trans{$1}/g; 
print "$string\n"; 

는이 작업을 변경해야합니다.

+0

@Kinopiko, 좋은 생각 같아. 적어도 나는 기계적인 대용 물을 많이 할 필요가 없다. – Mike

+0

@Kinopiko,이 대답은 지금까지 여섯 번째로 upvoted 피어되었습니다. 나는 y 연산자가 내가 기대했던 일을 할 수 없다고 확신한다. Perl의 기본 입력 구분 기호를 변경하는 것처럼 변경할 수 없습니다. 감사합니다 :)이 문제를 해결하기 위해 해시를 사용하면 내 코드는 다음과 같습니다. 내 $, '<', "./ test.txt"; my % trans = qw/ā ei a a : ōu o ɒ /; 내 @keys = keys % trans; for my $ key (@keys) { while (<$in>) { s/($ key)/$ trans {$ 1} /; 인쇄; } } 의심되는 부분이 있으면 저를 시정하십시오. 다시 한 번 감사드립니다 :) – Mike

+0

@ 키노 피코와 @ ysth, 설명 주셔서 감사합니다. 나는 몰랐다. 설명 된 코드 에서처럼이 방법으로 사용할 수 있습니다. – Mike

0

Text::Unaccent::PurePerl과 비슷한 작업을하려는 것 같습니다.

+0

@ 브라이언, 내게이 흥미로운 모듈을 소개 주셔서 고마워요 :)하지만 그것은 단지 내가하려고하는 일에 약간의 관련이있는 것 같아요. 나는 발음 기호의 한 체계를 다른 것으로 발음하기를 원했는데, Text :: Unaccent :: PurePerl의 단어 - 단어 변환과는 조금 다릅니다. – Mike

+0

글쎄, 그것은 똑같은 일을하고있다 : 당신은 가능한 한 복수의 문자로 문자를 대체하고있다. 위상 학적으로는 동일합니다. –

관련 문제