IF ステートメントで条件条件を生成できるようにする必要があります。コードは次のようになります。
if($filter_by $operator $value) {
# do something
}
たとえば、次のようになります: column1 > 10 これは明らかに機能しません。私はこれをやってみました:
if(eval "$filter_by $operator $value")
しかし、それも機能しません。何か案は?
IF ステートメントで条件条件を生成できるようにする必要があります。コードは次のようになります。
if($filter_by $operator $value) {
# do something
}
たとえば、次のようになります: column1 > 10 これは明らかに機能しません。私はこれをやってみました:
if(eval "$filter_by $operator $value")
しかし、それも機能しません。何か案は?
この関数は文字列を受け取り、現在のコンテキストでeval
文字列を Perl コードとして評価し、結果を返します。
値を直接補間してもうまくいきません。
$arg1 = "ab cd";
$arg2 = "123";
$op = "==";
$result = eval "$arg1 $op $arg2";
これは有効なPerlコードab cd == 123
でeval
はありません。
ただし、eval
'd コードは外部変数を認識できるため、簡単な解決策があります。
$result = eval('$arg1 ' . $op . ' $arg2');
引数名は補間されず、任意のコードを作成できます。
オペレーターに悪意のあるコードを導入する可能性があるため、これは BadIdea(TM) である可能性があることに注意してください。$op = '; system "rm -rf /"; '
「正しい」方法は、サブルーチン参照を使用することです。
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()
、多くの状況ではまったく問題ありません。
あなたが使用している式が機能しないかわかりません..以下に示すコードは私にとってはうまく機能します..
#!/perl/bin
use v5.14;
use warnings;
my $column = 12;
if ($column > 10) {
say "Greater";
} else {
say "Not greater";
}