Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Grep и заменить содержимое формы

Автор вопроса: Jamms SОтветов: 3

Работа над идентификацией и корректировкой записей содержимого формы. Я использую grep для удаления значений в массиве при отправке формы:

# Get the input
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

# The following zaps entire value containing the item(s) grepped.
  @OrigArray = split(/&/, $buffer);
  @pairs = grep(!/kartridgeclub|bubba.org|\.ru/i, @OrigArray);

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

Я не могу, я думаю, использовать простую замену вместо grep, так как мне нужно заменить весь элемент массива, содержащий нежелательные символы.

Другими словами, пользователь вводит в поле формы расширение "куча-мусора-всегда-содержащий-какой-то.org-с-ru" (или bubba.org и т.п.). Как мне определить, какую из фраз в grep он ввел? А затем заменить его фразой по моему выбору (вместо того, чтобы просто удалить ее из массива) и создать другую страницу "Спасибо" для этого пользователя?

Спасибо.

  • Есть ли причина, по которой вы не используете такой модуль, как CGI, для обработки ввода формы? Cfreak 14.05.2012
  • Вт, 15 мая 2012 г.... Большое спасибо всем, кто ответил. Странная проблема с сервером мешает мне двигаться дальше, но я хочу поблагодарить вас за всю вашу помощь и советы. Jamms S 15.05.2012

regexreplaceperlgrep

Ответы

Ответ 1 · рейтинг 1 · Kenosis

Вопрос Cfreak прагматичен: используйте CGI для обработки ввода вашей формы. Используйте функцию CGI param, проверьте параметры вашей формы на наличие "нежелательных последовательностей символов", а затем внесите соответствующие изменения и/или ответвления - на основе того, что вы нашли. Например:

use strict;
use warnings;
use CGI qw(:standard);
use 5.010;

my $input_field = param('input_field');

given(lc $input_field) {
    when(/kartridgeclub/) {
        print 'kartridgeclub';
        # do something else
    }
    when(/bubba\.org\b/) {
        print 'bubba.org';
        # do something else
    }
    when(/\.ru\b/) {
        print '.ru';
        # do something else
    }
    when(/this|that/) {
        print 'this or that';
        # do something else
    }
    default {
        print 'Your entry seems OK.';
        # do something else
    }
}

Ответ 2 · рейтинг 1 · dheffx

хотя я полностью согласен с другими сообщениями о том, что для этого лучше использовать CGI, я думаю, что эта строка должна достичь того, чего вы хотите.

my %pairs = map { $_ => ($_ =~ /kartridgeclub|bubba.org|\.ru/i ? 'invalid' : 'valid')} @orig_array;

Ответ 3 · Artyom V. Kireev

Только не используйте grep. Используйте старые добрые циклы for и напишите код.

for my $i (0 .. $#OrigArray) {
    my $pair = $OrigArray[$i];
    if ($pair =~ m/whatever/) {
        # you're welcome to change $OrigArray[$i] here
    }
}

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы