リストのすべての項目に関数を適用し、Pythonでmap(function, list)
に似た結果を保存したいと考えています。マップを使用して関数をリストに適用するにはどうすればよいですか?
は、マッピングする機能を渡そうとしましたが、このエラーを得た:
perl -le 'my $s = sub {}; @r = map $s 0..9'
panic: ck_grep at -e line 1.
これを行うための適切な方法は何ですか?
リストのすべての項目に関数を適用し、Pythonでmap(function, list)
に似た結果を保存したいと考えています。マップを使用して関数をリストに適用するにはどうすればよいですか?
は、マッピングする機能を渡そうとしましたが、このエラーを得た:
perl -le 'my $s = sub {}; @r = map $s 0..9'
panic: ck_grep at -e line 1.
これを行うための適切な方法は何ですか?
スカラー変数は、コードの参照を保持している場合 - 例えば:
$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;
試してみてください。map { $s->($_) } (0..9)
代わりに説明
map $s 0..9
のは:あなたはデリファレンスそれがsubroutinの呼び出しを許可する必要がありますので、あなたの例では、$s
は、サブルーチンへの参照です。これは、いくつかの方法で達成することができます:$s->()
または&$s()
(と私は忘れてるおそらくいくつかの他の方法)
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;
これは、Pythonからあまりにも違いはないのです。
@results = map { function($_) } @list;
@results = map function($_), @list;
または「ラムダ」と、
@results = map { $function->($_) } @list;
@results = map $function->($_), @list;
ニースの答えは、また '使用(マップブロックでは、ほとんどの他のブロックとは異なり、あなたは_not_字句プラグマをインストールしたり、他のコンパイル時のアクションを行うことができますことに注意してください.../'いいえ...')。 –
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
また、ループ内の* $ _ *は配列要素の別名であるため、コードを変更するとソース配列が変更されるため、クリアコードとしては推奨されません。 – MkV