2009-04-17 7 views
7

私はしかし、私は解析するより簡単なものとのprintfを交換したいと思いますPerlでprintfの代わりに何を使うべきですか?

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

のようなもので、多くの

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

を置き換えるつまり、翻訳を容易にするために、Perlでいくつかの文字列置換を使用する必要がありますこのような人間:

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()を取り除き、より翻訳者にやさしい方法で表を作成するperlスクリプトを作成することをお勧めします。このような

何か:

while(<>) 
{ 
    #regex for striping printf 

    #print in tabulated form 
} 

あなたも行番号を印刷した場合は、簡単に翻訳されたテキストを置き換えるために別のプログラムを書くことができます。

このソリューションでは、再抽出をprintf()から外して再利用することはできません。再利用可能です。


私は間違いなくprintf()に固執だろう、それは多くの言語間での標準です。

文字列出力のほとんどの標準になっています。 iforループです。

+0

私は "ループ"を使用します:-) –

+3

printfの問題は、あなたも注文を正しく取得する必要があるということです。つまり、言語が置換されるアイテムの順序を逆にすると、トランスレータはSOLであり、printf(たとえばC)をいくつか使用します。翻訳を簡単にするには、 "%1 $ d"を使用して簡単に移動できるようにする必要があります。 Template Toolkitはこれを簡単にします。 – Tanktalus

14

単に何について:非常にPerlyだ

print "Outputting $n numbers"; 

。派手な書式設定が必要ない場合は、文字列補間は間違いなく道のりです。

+0

提案してくれてありがとう、これは私が推測するほとんどの場合に適したアイデアですが、私は常に補間可能な変数を出力するとは限りません(Dumper(\%hash)が思い浮かびます)。それがどのように機能するか見てみる必要がありますが、私はおそらくもっと柔軟なものが必要でしょう... –

+3

補間に任意の式を出力するというイディオムがあります:print "Hash is:@ {[Dumper(\%hash)]}";それはかなりではありませんが、それは動作します。 –

+0

@Greg Hewgill私はあなたがこれを行うことができると思いませんでした - 素晴らしいです! – cowgod

-2

よく、perlはprintfの機能を持っています... 待って、あなたはpython's string formatting with dictのようなものをしたいですか?

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

MMMは、私が... perlで存在するそのような何かを知らない 少なくともない... は多分Text::Sprintf::Namedあなたの友人もでき、この「簡単に」

+0

明らかでない場合は、Cのprintfではなく、Perlの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とうまく組み合わせるもう1つのすばらしいモジュールはLocale::Maketext::Lexiconです。これにより、gettextの.po/.moファイルなどのより標準的なローカリゼーション形式を使用できます。これらのファイルには、トランスレータが翻訳が必要なすべてのテキストを処理するのに役立つGUIツールがあります。 Locale :: Maketext :: Lexiconにはヘルパースクリプト(xgettext.pl)も付属しています。ローカライゼーションファイルは、翻訳が必要なテキストを持つテンプレートやモジュールで最新の状態に保つのに役立ちます。私は過去にこの種の設定で非常に良い結果を出しました。一般Draegtunから答える

+0

私はここでi18nについて話しているわけではありません。(L :: M:Lexiconは完全に不適切です。私の仕事では、現在、文字列が奇妙な方法で抽出されるカスタム翻訳システムを使用する必要があります。 –

1

は素晴らしいですが、あなたは簡単にそれがこの機能を使用して行うことができますなどの強力な小さな何か(つまり、少ないメモリ)を必要としませたければ:

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; 
} 
関連する問題