2011-01-06 5 views
0

C言語の#define(プリプロセッサディレクティブ)のように、perlでコードブロックを定義する方法はありますか?Perlでコードブロックを定義できますか?

use constant PI=>3.14; 

このように、変数のみを定義できます。 コードブロックで同じことを実行できますか?

次のコード部分は機能しません。どうすれば同じことができますか?

use constant FUN=>{ 
$i=3; 
while($i) 
{ 
    print "$i\n";--$i;} 
} 

答えて

0

キーワードを使用して、機能を定義します。 C言語とは異なり、前処理はperlなどのスクリプト言語ではほとんど役に立たない。

+0

まあ、それもほぼすべてのコンパイル言語プリプロセッサなしで仲良く、Cプリプロセッサは、主にインライン関数を定義するために使用されて好きで...プラスではないです:) – delnan

+0

サブは大丈夫ですが、プリプロセッサはC. – Joe

+0

ように許可されている場合、私はチェックしていましたどのような目的のためにプリプロセッサが必要ですか?パフォーマンス? – VGE

3

Perlにはマクロがありません。 (十分に熟知されたプログラマは、ソースフィルタを使ってそれらを偽造することができますが、そのような黒い魔法は避けてください)。代わりに、常に同じ値を返すサブルーチンを作成します。あなたは

use constant PI => 3.14; 

を書くときにPerlが何をするか(基本的に)

sub PI() { 3.14 } 

constantプラグマは値だけではなく、コードを定義するために使用することができています。コードを再利用するには、代わりにサブルーチンを定義します。

+0

Perlにはマクロがあります。 'Devel :: Declare'を参照してください。 – jrockway

2

ほとんどの人が通り(括弧の位置を与えるか、または取る)ことを記述します。あなたが行うことができ

sub FUN 
{ 
    my $i = 3; 
    while ($i) 
    { 
     print "$i\n"; 
     --$i; 
    } 
} 

:Perlで

my $FUN = sub { print "$_\n" foreach (qw(3 2 1)); }; 
&$FUN(); 
+0

または '$ FUN - >();'(少し読みやすい?) – mfontani

-1

のtry/catchは、この方法を実装することができます。

eval { 
    # do something 
    die "Exception1\n" if $something_not_right; 
}; 
if ([email protected]) { 
    for ([email protected]) { 
    /Exception1/ && do { handle_excp1(); last; }; 
    /Exception2/ && do { handle_excp2(); last; }; 
    die "Don't know how to handle [email protected]\n"; 
    }; 
}; 

もちろん、例外をスローするために文字列リテラルを使用する必要はありません。どのオブジェクト参照でも可能です。

関連する問題