Вопрос

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

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

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

Это было полезно?

Решение

Без явной переменной цикла в цикле 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.

Другие советы

А for цикл присваивает псевдонимы каждому элементу списка, к которому он зацикливается $_.В данном случае имеется только один элемент, $text.

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

s/&/&amp;/g;

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

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

неоднократно.Смотрите также Перлдок Перлсин.

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

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

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

sub html_filter {
    local $_ = shift;

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

    return $_;
}

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

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

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

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

Его очистка & amp ;, < > и заключать в кавычки символы и заменять их соответствующими символами HTML.

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

Исходный код может быть более гибким, если использовать 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top