0

IF ステートメントで条件条件を生成できるようにする必要があります。コードは次のようになります。

if($filter_by $operator $value) {
  # do something
}

たとえば、次のようになります: column1 > 10 これは明らかに機能しません。私はこれをやってみました:

if(eval "$filter_by $operator $value") 

しかし、それも機能しません。何か案は?

4

3 に答える 3

3

この関数は文字列を受け取り、現在のコンテキストでeval文字列を Perl コードとして評価し、結果を返します。

値を直接補間してもうまくいきません。

$arg1 = "ab cd";
$arg2 = "123";
$op = "==";

$result = eval "$arg1 $op $arg2";

これは有効なPerlコードab cd == 123evalはありません。

ただし、eval'd コードは外部変数を認識できるため、簡単な解決策があります。

$result = eval('$arg1 ' . $op . ' $arg2');

引数名は補間されず、任意のコードを作成できます。

オペレーターに悪意のあるコードを導入する可能性があるため、これは BadIdea(TM) である可能性があることに注意してください。$op = '; system "rm -rf /"; '

于 2012-09-25T11:25:18.847 に答える
0

「正しい」方法は、サブルーチン参照を使用することです。

my $compare = sub { return $_[0] > $_[1] };
if ($compare->(1,2)) { print "One is greater than two"}

$compare = sub { return $_[0] < $_[1] };
if ($compare->(1,2)) { print "One is less than two"}

eval()これは、 amon が言及しているセキュリティの問題と、より明確なコードの両方のために、よりも優れたスタイルと見なされます。

そうは言ってもeval()、多くの状況ではまったく問題ありません。

于 2012-09-25T12:05:31.290 に答える
0

あなたが使用している式が機能しないかわかりません..以下に示すコードは私にとってはうまく機能します..

#!/perl/bin
use v5.14;
use warnings;

my $column = 12;
if ($column > 10) {
    say "Greater";

} else {
    say "Not greater";
}
于 2012-09-25T11:23:13.343 に答える