2010-12-29 17 views
2

次のサンプルコードを検討してください。sprintf型の引数をPerl関数に渡すことはできますか?

my $a = "test"; 
my $b = "stackoverflow"; 

test("%s - %s\n", $a, $b); 

sub test { 
    my $error = sprintf(@_); 
    print $error; 
} 

これは、フォーマットされた文字列ではなく3を出力します。私がしようとしていることをすることさえ可能ですか?

答えて

6

VGEが示唆したように、それが問題を引き起こしているプロトタイプですが、あなたはshiftを使用する必要は、ないpop

sub test { 
    my $error = sprintf(shift, @_); 
    print $error; 
} 

sprintfはスカラーコンテキストでは最初の引数を評価します。これが配列の場合は、配列の長さを取得します。

1

はperldocは のsprintf FORMAT、LIST

は、Cライブラリ関数のsprintfの通常のprintfの規則でフォーマットされた文字列を返しますと言います。詳細は以下を参照し、一般的な原則の説明についてはシステム上のsprintf(3)またはprintf(3)を参照してください。

私はこれを試したことはありませんが、@ _をポップアップしてフォーマットを取得し、残りのリストを渡すことができます。

+0

私はsprintfの仕組みを知っていますが、私が働くことができないのは、書式を内部で行うためにフォーマットと要素をサブルーチンに渡しているときです。形式と要素を分けても違いはありませんが、sprintf(@ _)はそれと同じことをします。 – perlit

+0

sprintf(シフト、@ _)が動作します –

関連する問題