4

eval関数の使用で問題が発生しています。

実際、私はSQLデータベース内にいくつかの関数名を持っています。私の目標は、perl内でそれらの関数を実行することです(SQLで取得した後)。

$ RssSource-> {$ k} {Proceed}にSQLから取得した文字列として「&test」が含まれていることを考慮して、これが私が行っていることです。

my $str2 = "ABCD";
eval "$RssSource->{$k}{Proceed}";warn if $@;

sub test
{
   my $arg = shift;

   print "fct TEST -> ", $row, "\n";
}

これは正しく機能しており、次のように表示されます。

fct TEST ->

ただし、引数として$str2を$RssSource-> {$ k} {Proceed}に渡せるようにしたいのですが、方法がわかりません。試行したすべての構文でエラーが返されます。

eval "$RssSource->{$k}{Proceed}$str2"
eval "$RssSource->{$k}{Proceed}($str2)"
eval "$RssSource->{$k}{Proceed}"$str2
eval "$RssSource->{$k}{Proceed}"($str2)

評価された関数に引数を適切に渡す方法を誰かに教えてもらえますか?

あなたの助けをどうもありがとう

よろしく。

フローレント

4

5 に答える 5

5

私は$RssSource->{$k}{Proceed}常にnameまたはを含むと仮定し&nameます。そうでなければ、あなたが求めていることはあまり意味がありません。

my $func_name = $RssSource->{$k}{Proceed};
$func_name =~ s/&//;
my $func_ref = \&$func_name;    # Works with strict on!
$func_ref->(@args);

エラーチェックを追加する場合は、サブを呼び出すことができるかどうかを以下でチェックします。

defined(&$func_ref)
于 2012-10-03T22:21:22.827 に答える
3

使用している文字列がeval常にサブ呼び出しである場合は、次のいずれかの方法でeval文字列を作成できます。

$RssSource->{$k}{Proceed} . '($str2)'

(最も一般的)、または

$RssSource->{$k}{Proceed} . "(\"$str2\")"

(不法)

ソリューションで発生した問題は次のとおりです。

eval "$RssSource->{$k}{Proceed}$str2"に評価されeval "&testABCD"ます。この潜水艦は存在しません。

eval "$RssSource->{$k}{Proceed}($str2)"に評価され"&test(ABCD)"ます。ベアワードは許可されていません。

eval "$RssSource->{$k}{Proceed}"$str2文字列の後には、別の変数ではなく、ある種の演算子を続ける必要があります。

eval "$RssSource->{$k}{Proceed}"($str2)文字列を関数として呼び出そうとしています。これはPerlではサポートされていません。

于 2012-10-03T21:33:16.280 に答える
2

データベース内のデータを変更して、関数名だけを含めることができる場合、つまり、testではなく&test、evalを使用するのではなく、シンボリック参照によって関数を呼び出すことができます。

$fn="test";
&{$fn}("argument")
于 2012-10-03T21:35:26.220 に答える
1

あなたが言うように、データベースに関数名だけが含まれている場合は、evalは必要ありません。それらをシンボリック参照として使用できます(ただし、&を削除してください)。これを行う最新の方法は、&を使用して逆参照するのではなく、矢印演算子を使用することです。

{
    no strict 'refs'; # hopefully you have strict on already...
    $RssSource->{$k}{Proceed}->($str2);
}
于 2012-10-03T23:23:20.610 に答える
0

池上さんの答えとよく似てcanいますが、私の好みです。TIMTOWTDI。

my $func_name = $RssSource->{$k}{Proceed};
$func_name =~ s/&//;
my $func_ref = __PACKAGE__->can($func_name)
  or die "No function named $func_name";
$func_ref->(@args);
于 2012-10-04T02:13:03.500 に答える