Perl для объяснения цикла - PullRequest
1 голос
/ 19 июня 2009

Я просматриваю код Perl и вижу это:

sub html_filter {
    my $text = shift;
    for ($text) {
        s/&/&/g;
        s/</&lt;/g;
        s/>/&gt;/g;
        s/"/&quot;/g;
    }
    return $text;
}

что делает цикл for в этом случае и почему вы делаете это таким образом?

Ответы [ 7 ]

8 голосов
/ 19 июня 2009

Цикл for устанавливает псевдоним каждого элемента списка на $_. В этом случае есть только один элемент, $text.

В теле это позволяет писать

s/&/&amp;/g;

и т.д.. вместо того, чтобы писать

$text =~ s/&/&amp;/g;

несколько раз. Смотрите также perldoc perlsyn .

5 голосов
/ 19 июня 2009

Как указывает г-н Хьюгилл, пример кода неявно локализует и псевдоним $ _, магической подразумеваемой переменной.

Он предлагает замену, которая будет более читабельной за счет стандартного кода.

Нет причин жертвовать читабельностью ради краткости. Просто замените неявную локализацию и назначение явной версией:

sub html_filter {
    local $_ = shift;

    s/&/&amp;/g;
    s/</&lt;/g;
    s/>/&gt;/g;
    s/"/&quot;/g;

    return $_;
}

Если бы я не очень хорошо знал Perl и наткнулся на этот код, я бы знал, что мне нужно взглянуть на документы для $_ и local - в качестве бонуса в perlvar есть несколько примеров локализации $_.

Для тех, кто много пользуется Perl, вышесказанное должно быть легко понять.

Так что на самом деле нет причин жертвовать читабельностью ради краткости.

5 голосов
/ 19 июня 2009

Без явной переменной цикла цикл for использует специальную переменную, называемую $_. Операторы подстановки внутри цикла также используют специальную переменную $_, поскольку не указано ничего другого, так что это всего лишь хитрость для сокращения исходного кода. Я бы, вероятно, написал эту функцию как:

sub html_filter {
    my $text = shift;
    $text =~ s/&/&amp;/g;
    $text =~ s/</&lt;/g;
    $text =~ s/>/&gt;/g;
    $text =~ s/"/&quot;/g;
    return $text;
}

Это не повлияет на производительность и может быть прочитано другими пользователями, кроме Perl.

2 голосов
/ 19 июня 2009

Он очищает символы &, <,> и кавычки и заменяет их соответствующими символами HTML-сущности.

2 голосов
/ 19 июня 2009

Это просто используется для псевдонима $ text к $ _, переменной по умолчанию. Готово, потому что им лень использовать явную переменную или они не хотят тратить драгоценные циклы на создание нового скаляра.

1 голос
/ 19 июня 2009

Исходный код может быть более гибким, если использовать wantarray для проверки нужного контекста:

sub html_filter {
    my @text = @_;
    for (@text) {
        s/&/&amp;/g;
        s/</&lt;/g;
        s/>/&gt;/g;
        s/"/&quot;/g;
    }
    return wantarray ? @text: "@text"; }

Таким образом, вы можете вызвать его в контексте списка или скалярном контексте и получить правильные результаты, например:

my @stuff = html_filter('"','>');
print "$_\n" for @stuff;

my $stuff = html_filter('&');
print $stuff;
1 голос
/ 19 июня 2009

Он просматривает ваш текст и заменяет амперсанды (&) на & amp, <на & lt,> на & gt и "на & quot. Вы бы сделали это для вывода в документ .html ... это правильные символы сущностей .

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