1

関数が宣言されたときの変数の値を使用(評価しますか?)する動的関数を作成したいと思います。

以下の例では、関数が呼び出されたときに使用できるように、$varがグローバル変数として存在する必要があります。

my $var = 'something';

someFunction(sub { return $_[0] eq $var; });

しかし、動的関数を作成する方法があると思いますので、次のように宣言します。

someFunction(sub { return $_[0] eq 'something'; });

どうやってやるの!?:)

4

4 に答える 4

6

少しずさんですが、動作します:

#!/usr/bin/env perl                                                             

use warnings;
use strict;

my $var = 'something';

my $f1 = sub { my $v = $_[0]; return sub { return $_[0] eq  $v } };

my $f2 = $f1->($var);

$var = 'other thing';

print $f2->('something');

ラムダを使用すると、すべてが可能になります。

于 2012-09-06T01:55:16.723 に答える
0

古くて単純なストレート クロージャーの何が問題になっているのでしょうか。

sub genf { my $v = shift; sub { shift eq $v } }

my $f = genf('something'); # Or genf($var)

print &$f('something');
print &$f('another thing');
于 2012-09-06T23:02:27.307 に答える
0

そのローカル コピーをキャプチャするのはどうですか。

someFunction( do { my $v = $var; sub { $_[0] eq $v } } );

そうすれば、$var後で変更されたとしても、匿名サブは元の値を持つそのローカル コピーを引き続き使用します。

于 2012-09-09T20:42:50.380 に答える
0

他の人たちと同じように、この目的にはクロージャで十分だと思います。コンパイラが期待どおりに最適化できたとしても、私は驚かないでしょう。

それでも、お勧めしませんが、あなたが求めたことを試すことができます。

my $var = 'something';

my $sub = eval 'sub { return $_[0] eq \'' . $var .  '\'}';

someFunction( $sub );

の値を使用してコード参照を文字列として作成し、$varそれevalを作成すると、Perl コードにコンパイルされます。コードが評価されるまでに、の内容は生の文字列になるため、余分な引用符を含める必要があることに注意してください$var

繰り返しますが、これはお勧めできません。なんで?$var特にコンテンツが外の世界からのものである場合は危険だからです。

于 2012-09-07T04:31:39.940 に答える