Как оказалось, пакет HTML::FillInForm использует свою собственную реализацию функции escapeHTML, отличную от реализации в пакете CGI.
Поэтому если вы используете HTML::FillInForm или CGI::Application::Plugin::FillInForm (который по сути есть интерфейс к первому) для обработки форм со значениями, заэскейпленными через CGI::escapeHTML, вы может столкнуться с некорректной "подсветкой" выбранного значения одной из <option> внутри <select>, к примеру (непростановка атрибута selected там, где необходимо).
Проблема заключается в том, что HTML::FillInForm использует пакет HTML::Parser для разбора передаваемого кода, который в свою очередь при разборе разэскейпивает в текущую кодировку, из-за чего пакету HTML::FillInForm необходимо использовать функцию escapeHTML для значений атрибутов тэгов после парсера при сравнения со значением параметров пользователя, переданных для заполнения формы. Если используются разные реализации escapeHTML (пользователем и пакетом), то в некоторых случаях получаются "разные" одинаковые строки. 🙂
Для исправления ситуации достаточно добавить следующий код в начало вашего скрипта:
use HTML::FillInForm;
package HTML::FillInForm;
use CGI (qw/escapeHTML/);
sub escapeHTML {
my ($self, $toencode) = @_;
return undef unless defined($toencode);
return CGI::escapeHTML($toencode);
}
1;