Безопасный способ использовать параметр ввода текста CGI? - PullRequest
1 голос
/ 28 июня 2011

Хорошо, есть форма ввода с 4 текстовыми полями.Я получаю ввод, используя CGI.pm:

my $exc0 = param('exclude0') || 'a'; 
my $exc1 = param('exclude1') || 'a';
my $exc2 = param('exclude2') || 'a';
my $exc3 = param('exclude3') || 'a';

Причина, по которой я должен был включить || 'a', состоит в том, чтобы позволить ему работать, если не было ввода.Есть ли более безопасный способ сделать это?

Он вызывается позже в регулярном выражении:

next if ($totalmatch->[2] =~ /\b$exc0\b/i);
next if ($totalmatch->[2] =~ /\b$exc1\b/i);
next if ($totalmatch->[2] =~ /\b$exc2\b/i);
next if ($totalmatch->[2] =~ /\b$exc3\b/i);

Где $totalmatch->[2] - предложение.Если я не проверяю отсутствие ввода, то при отсутствии ввода совпадения не возникают (иначе оно включает $exc в каждом случае).Я предполагаю, что это потому, что в каждом предложении есть неопределенный знак или пробел?

Я пробовал || '', и я полагаю, я мог бы использовать if ($exc0) или if defined() или eq '' но просто ищу помощи.

Большое спасибо за ваше время.

1 Ответ

3 голосов
/ 28 июня 2011

Если вы не выполните use warnings и не выполните || 'a', вы должны получить предупреждение: Use of uninitialized value at ...

Это лучшая практика в perl (или любом другом языке, если на то пошло)проверить наличие переменной, прежде чем использовать ее в функции или, в данном случае, в регулярном выражении, если только нет особых причин, по которым она является нулевой, что является желательной возможностью.

Вы должны действительно получитьизбавьтесь от || 'a' и сделайте это:

next if (length($exc0) and $totalmatch->[2] =~ /\b$exc0\b/i);
next if (length($exc1) and $totalmatch->[2] =~ /\b$exc1\b/i);
next if (length($exc2) and $totalmatch->[2] =~ /\b$exc2\b/i);
next if (length($exc3) and $totalmatch->[2] =~ /\b$exc3\b/i);

Вы не хотите использовать defined() здесь, потому что определен '', и у вас все еще будет проблема с его соответствием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...