2009-04-17 6 views
7

내가 번역을 용이하게하기 위해 펄에서 일부 문자열 대체를 사용할 필요, 즉 그러나Perl에서 printf 대신 무엇을 사용해야합니까?

printf ("Outputting %d numbers", $n); 

처럼 무언가에 의해 많은

print "Outputting " . $n . " numbers"; 

교체, 나는에 대한 구문 분석 쉽게 무언가의 printf를 대체하고 싶습니다 인간은 다음과 같습니다 :

printX ("Outputting {num} numbers", { num => $n }); 

또는 일반적으로 더 많은 것 Perly.

CPAN이든 아니든간에 당신이 좋아하고 좋아하는 것을 추천 할 수 있습니까?

답변

12

대부분의 템플릿 모듈 CPAN에 아마 당신이 원하는 것을 할 것입니다. Template Toolkit을 사용하는 예는 다음과 같습니다.

use Template; 
my $tt = Template->new; 

$tt->process(\"Outputting [% num %] numbers\n", { num => 100 }); 


그리고 당신은 같은 것을 사용하여 필요한 예를 모방 할 수 ...

sub printX { 
    use Template; 
    my $tt = Template->new(START_TAG => '{', END_TAG => '}'); 
    $tt->process(\($_[0] . "\n"), $_[1]); 
} 

당신이있어 ...

printX 'Outputting {num} numbers' => { num => 100 }; 
4

문자열을 구문 분석하는 다른 방법이 필요합니다. 나는 너에게 이것을하지 말라고 조언 할 것이다. % d를 가진 구문을 보는 유일한 사람은 개발자이며 그는 의미가 무엇인지 정확하게 이해할 것입니다. padding, decimals 등의 옵션 때문에 printf 구문이 강력합니다.

대체 방법을 많이 사용하고 싶습니다. s/{num}/$ n /을하는 것은 영원한 일입니다.

+1

을 "유일한 한 사람이다 % d를 가진 구문을 보는 것은 개발자입니다. "->이 경우가 아니라 번역자와 예쁜 바보 같은 사람도 볼 수 있습니다. 나는 printf 자신과 잘 될 것이지만 나는 다른 것을 생각해야합니다. 사람들 ... –

1

번역자가되는 것에 대한 귀하의 의견에 비추어 볼 때 모든 printf()을 제거하고 더 쉽게 번역 할 수있는 방법으로 표를 작성하는 펄 스크립트를 작성하는 것이 좋습니다. 이 같은

뭔가 : 당신이 줄 번호를 인쇄 할 경우

while(<>) 
{ 
    #regex for striping printf 

    #print in tabulated form 
} 

너무 쉽게 번역 된 텍스트를 대체 할 다른 프로그램을 작성할 수 있습니다.

이 솔루션을 사용하면 printf()에서 다시 고려하지 않고 재사용 할 수 있습니다. 나는 확실히 printf() 스틱 것


, 그것은 많은 언어에서 표준입니다.

거의 문자열 출력의 표준이되었습니다. 마찬가지로 ifor 루프입니다.

+0

"루프"를 사용합니다 :-) –

+3

printf의 문제점은 주문을 올바르게 받아야한다는 것입니다. 즉, 언어가 대체되는 항목의 순서가 바뀌면 변환기는 SOL이며 일부 printf (예 : C)를 갖습니다. 번역을 쉽게하려면 "% 1 $ d"을 사용하여 쉽게 옮길 수 있어야합니다. Template Toolkit은이 작업을 간단하게 만듭니다. – Tanktalus

14

무엇 단순히 약 : 매우 페를 리입니다

print "Outputting $n numbers"; 

. 멋진 서식을 필요로하지 않는다면, 문자열 보간법이 반드시 필요합니다.

+0

제안을 주셔서 감사합니다, 이것은 대부분의 경우에 맞는 생각이지만, 나는 항상 interpolateble 변수를 출력하지는 않습니다 (Dumper (\ % hash)가 떠오른다). 어떻게 작동하는지 알아야하지만, 좀 더 융통성있는 것이 필요할 것입니다 ... –

+3

보간에서 임의의 표현식을 출력하는 관용구가 있습니다 : print "Hash is : @ {[Dumper (\ % hash)]}"; 그것은 꽤 아니지만 그것은 작동합니다. –

+0

@Greg Hewgill 당신이 할 수 있을지 전혀 몰랐습니다. - 끝내 주네! – cowgod

-2

잘, 펄은 python's string formatting with dict 같은 것을 원하는가, printf 기능 ... 대기를 가지고?

>>> print '%(key)s' % {'key': 'value'} 
value 

음, 나는 ... 펄에 존재하는 그런 일을 모르는 적어도 ... 어쩌면 Text::Sprintf::Named 당신의 친구가 될 수있는이 "쉽게"

+0

명확하지 않은 경우 Perl의 printf 대신 C의 printf 대신에 무언가를 사용하고 싶습니다. –

5

print 내장은 매우입니다 대부분의 상황에 편리합니다. 변수 보간 외에 :

print "Outputting $n numbers"; # These two lines 
print "Outputting ${n} numbers"; # are equivalent 

print 여러 인수를 취할 수 있음을 기억하십시오, 그래서 당신은 서브 루틴 호출의 결과 인쇄해야하는 경우 하나의 문자열로 먼저를 연결할 필요가 없습니다 :

print "Output data: ", Dumper($data); 

그러나 단순한 정수가 아닌 숫자를 출력하려면 printf의 형식을 편리하게 설정해야합니다. 다른 데이터 유형을 출력하는 것은 print과 함께 쉽습니다.

당신은 join에 편리하게 출력 배열을 사용할 수 있습니다

print join ', ', @array; 

를 출력 해시에 mapkeys와 결합 : 데이터 주위에 출력 따옴표에 당신이 원하는 경우

print join ', ', map {"$_ : $hash{$_}"} keys %hash; 

사용 qq 연산자 :

print join ', ', map {qq("$_" : "$hash{$_}"}) keys %hash; 
5

번역을 쉽게하려면 L10n/i18n CPAN 모듈 중 하나를 사용하는 것이 좋습니다. 특히, 귀하의 접근 방식이 왜 끝나야하는지에 대한 개요는 written up as part of the Local::Maketext docs입니다.

Locale :: Maketext와 잘 어울리는 또 다른 위대한 모듈은 Locale::Maketext::Lexicon입니다. 이를 통해 gettext의 .po/.mo 파일과 같은보다 표준화 된 현지화 형식을 사용할 수 있습니다.이 파일에는 번역사가 번역해야하는 모든 텍스트를 처리하는 데 도움이되는 GUI 도구가 있습니다. Locale :: Maketext :: Lexicon에는 번역이 필요한 텍스트가있는 템플릿이나 모듈로 현지화 파일을 최신 상태로 유지하는 도우미 스크립트 (xgettext.pl)도 함께 제공됩니다. 과거에 이런 종류의 설정으로 아주 좋은 결과를 얻었습니다.

+0

나는 여기서 i18n을 말하고있는 것이 아니다. (L :: M : Lexicon은 완전히 부적절하고, 나중에는 그 이상이다.)). 오히려 번역을위한 문자열을 준비하고있다. 제 작품에서는 문자열이 이상한 방식으로 추출되는 사용자 정의 번역 시스템을 사용해야합니다. –

1

는 일반적으로 Draegtun에서 대답하는 것 역시 매우 중요하지만, 작은 뭔가 (즉, 적은 메모리), 당신은 쉽게이 기능을 사용 할 수있는 강력한하지 않아도 원하는 경우 :

sub printX { 
    my ($format, $vars) = @_; 

    my @sorted_keys = sort { length($b) <=> length($a) } keys %{ $vars }; 
    my $re = join '|', map { "\Q$_\E" } @sorted_keys; 

    $format =~ s/ \{ \s* ($re) \s* \} /$vars->{$1}/xg; 

    print $format; 
}