Perl для объяснения цикла
Вопрос
Я просматриваю код Perl и вижу это:
sub html_filter {
my $text = shift;
for ($text) {
s/&/&/g;
s/</</g;
s/>/>/g;
s/"/"/g;
}
return $text;
}
что делает цикл for в этом случае и почему вы делаете это именно так?
Решение
Без явной переменной цикла в цикле for
используется специальная переменная $_
. Операторы подстановки внутри цикла также используют специальную переменную <=>, потому что не указано ничего другого, так что это всего лишь прием, чтобы сделать исходный код короче. Я бы, вероятно, написал эту функцию как:
sub html_filter {
my $text = shift;
$text =~ s/&/&/g;
$text =~ s/</</g;
$text =~ s/>/>/g;
$text =~ s/"/"/g;
return $text;
}
Это не повлияет на производительность и может быть прочитано другими пользователями, кроме Perl.
Другие советы
А for
цикл присваивает псевдонимы каждому элементу списка, к которому он зацикливается $_
.В данном случае имеется только один элемент, $text
.
Внутри тела это позволяет писать
s/&/&/g;
и т. д.вместо того, чтобы писать
$text =~ s/&/&/g;
неоднократно.Смотрите также Перлдок Перлсин.
Как указывает г-н Хьюгилл, пример кода неявно локализуется и псевдоним для $ _, магической подразумеваемой переменной. Р>
Он предлагает замену, которая будет более читабельной за счет стандартного кода.
Нет причин жертвовать читабельностью ради краткости. Просто замените неявную локализацию и назначение явной версией:
sub html_filter {
local $_ = shift;
s/&/&/g;
s/</</g;
s/>/>/g;
s/"/"/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/&/&/g;
s/</</g;
s/>/>/g;
s/"/"/g;
}
return wantarray ? @text: "@text"; }
Таким образом, вы можете вызвать его в контексте списка или скалярном контексте и получить правильные результаты, например:
my @stuff = html_filter('"','>');
print "$_\n" for @stuff;
my $stuff = html_filter('&');
print $stuff;