문제
나는 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;
자꾸. 또한보십시오 Perldoc Perlsyn.
Hewgill 씨가 지적했듯이, 코드 샘플은 암시 적으로 현지화되고 마법의 묵시적 변수 인 $ _에 별명을 띠고 있습니다.
그는 보일러 플레이트 코드 비용으로 더 읽을 수있는 대체물을 제공합니다.
간결성에 대한 가독성을 희생 할 이유가 없습니다. 암시 적 현지화 및 할당을 명시 적 버전으로 바꾸기 만하면됩니다.
sub html_filter {
local $_ = shift;
s/&/&/g;
s/</</g;
s/>/>/g;
s/"/"/g;
return $_;
}
내가 Perl을 잘 몰랐고이 코드를 발견했다면, 나는 문서를보아야한다는 것을 알고 있습니다. $_
그리고 local
-보너스로 perlvar
, 몇 가지가 있습니다 현지화의 예 $_
.
Perl을 많이 사용하는 사람이라면 위의 내용은 이해하기 쉽습니다.
따라서 여기서 간결하게 가독성을 희생 할 이유가 없습니다.
기본 변수 인 $ _로 $ 텍스트를 별칭하는 데 사용됩니다. 명백한 변수를 사용하기에는 너무 게으르거나 새로운 스칼라를 만드는 귀중한주기를 낭비하고 싶지 않기 때문입니다.
그것의 청소 및 <,> 문자를 인용하고 적절한 HTML 엔티티 숯으로 대체합니다.
그것은 당신의 텍스트를 통해 반복되고 &)를 & <, with with with with "와 함께 앰퍼 샌드 (&)를 대체합니다. .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;