2010-11-18 9 views

答えて

7

スカラー変数は、コードの参照を保持している場合 - 例えば:

$double->(50); # Returns 100. 

mapにそれを適用する:

my $double = sub { 2 * shift }; 

あなたはこのように、非常にあなたは、Pythonでする方法は、コードを呼び出すことができます例:

my @doubles = map $double->($_), 1..10; 

またはこの方法:

my @doubles = map { $double->($_) } 1..10; 

{}中括弧で定義されたブロックは、Perlの文の任意の数を含めることができるので、第二の変形は、より堅牢である:

my @doubles = map { 
    my $result = 2 * $_; 

    # Other computations, if needed. 

    $result; # The return of each call to the map block. 
} 1..10; 
+1

ニースの答えは、また '使用(マップブロックでは、ほとんどの他のブロックとは異なり、あなたは_not_字句プラグマをインストールしたり、他のコンパイル時のアクションを行うことができますことに注意してください.../'いいえ...')。 –

+0

map * EXPR LIST *形式ではなく* map BLOCK LIST *形式で* use *と* no *を使うことができます。それらを使うならば、式からブロックを曖昧さを取り除く必要があるでしょう指導者と;あるいは、* do * BLOCK *を式として使用することができ、* no *と* use *を含めることができます。厳しいを使用してください。私の@a = 1.10;私の@b = map {;厳密な「ヴァルス」はありません。 $ x = $ _ + 1; $ x} @a;私の@c = map {do {no strict 'vars'; $ x = $ _ + 1; $ x}} @a; – MkV

+0

また、ループ内の* $ _ *は配列要素の別名であるため、コードを変更するとソース配列が変更されるため、クリアコードとしては推奨されません。 – MkV

5

試してみてください。map { $s->($_) } (0..9)代わりに説明

map $s 0..9のは:あなたはデリファレンスそれがsubroutinの呼び出しを許可する必要がありますので、あなたの例では、$sは、サブルーチンへの参照です。これは、いくつかの方法で達成することができます:$s->()または&$s()(と私は忘れてるおそらくいくつかの他の方法)

4
my $squared = sub { 
     my $arg = shift(); 
     return $arg ** 2; 
    }; 

、その後のいずれか

my @list = map { &$squared($_) } 0 .. 12; 

または

my @list = map { $squared->($_) } 0 .. 12; 

または多分

my $squared; 
BEGIN { 
    *Squared = $squared = sub(_) { 
     my $arg = shift(); 
     return $arg ** 2; 
    }; 
} 
my @list = map { Squared } 0 .. 12; 
2

これは、Pythonからあまりにも違いはないのです。

@results = map { function($_) } @list; 
@results = map function($_), @list; 

または「ラムダ」と、

@results = map { $function->($_) } @list; 
@results = map $function->($_), @list;