1

文字列に含まれる perl のサブを使用しようとしています。

現在、私は次のようなものを持っています

$sub = "sub{ my $in = shift; if($in =~ /bla.*wam/){return 1;}}";

私はやってみる

$sub->("test");

また

&{$sub}->("test");

上記の両方の例は、関数全体を、見つけられなかったサブルーチンの名前であるかのように吐き出しています。次のようになります。

Undefined subroutine [function then printed here]

ここで何が間違っていますか?

4

3 に答える 3

5

$subスカラーに string が含まれていたとしましょう"foobar"。次に と言うと、という名前$sub->()のサブルーチンを呼び出そうとしています。そのサブルーチンが存在しない場合は、エラーが発生します。 foobar

という名前のサブルーチンを呼び出そうとしていますがsub{ my $in = shift; if($in =~ /bla.*wam/){return 1;}}、これは完全にばかげたサブルーチンの名前であり、明らかにプログラムには存在しません。(そして実際には、二重引用符で囲まれているため、$in気付かないうちに何かとして補間されている可能性があります。)

ですから、まずそうしないでください。

無名サブルーチンが必要な場合は、次のようにします。

my $sub = sub { my $in = shift; if($in =~ /bla.*wam/) { return 1; } };

次に、次のように実行します。$sub->("test");

本当に文字列内のコードを実行する必要がある場合は、 eval.

my $sub = eval 'sub{ my $in = shift; if($in =~ /bla.*wam/) { return 1; } }';

これにより、文字列内のコードが評価され、サブ参照である結果が返されます。これらの文字列がどこから来ているのか非常に注意してください。それらを作成する人は誰でも、あなたのプログラムを好きなようにさせることができます。

于 2013-05-09T20:19:53.483 に答える
2

コードと文字列は同じではありません。特に、あなた$subが実際に何であるかを誤解しているとき。コード文字列は二重引用符で囲まれた文字列です。$in の内容がであると仮定するとbla wam、これを に割り当てます$sub:

"sub{ my bla wam = shift; if(bla wam =~ /bla.*wam/){return 1;}}";

これはそのような構文エラーです。

ただし、無名サブルーチンを変数に直接割り当てることができます。

my $sub = sub{
  my $in = shift;
  if ($in =~ /bla.*wam/) {
    return 1;
  }
};

あなたの例のようにそれを呼び出します(ただし、私はスタイルを好みます$sub->(...))。

于 2013-05-09T20:17:51.833 に答える
1

前後の引用符を削除しますsub

$sub = sub { my $in = shift; if($in =~ /bla.*wam/){ return 1 } };
于 2013-05-09T20:15:45.387 に答える