Это должен быть комментарий, но комментарии слишком тесны для чего-то подобного, поэтому я делаю это CW.
Для случая, который вы показали, где содержимое переменных, которые будут переданы в string eval , принятое решение является правильным.
Если, однако, содержимое $a
и $b
взято из пользовательского ввода, взгляните на следующий скрипт:
#!/usr/bin/perl
use strict; use warnings;
my $x = '80';
my $y = '; warn "evil laugh!\n"; exit';
if ( eval ($x . $y) ) {
print "it worked!!!\n";
}
Если пользователь вводит строки, ничто не мешает пользователю передать вашей программе строку ';system "rm -rf /bin"'
.
Итак, правильное решение вашего вопроса потребует написания или использования синтаксического анализатора выражений.
Кстати, вы не должны использовать $a
и $b
в качестве имен переменных, поскольку они являются локальными переменными магического пакета, используемыми sort , и поэтому они освобождаются от строгого & mdash ; и вы должны всегда использовать строгие и предупреждения в своих программах.