문제

나는 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;

자꾸. 또한보십시오 Perldoc Perlsyn.

Hewgill 씨가 지적했듯이, 코드 샘플은 암시 적으로 현지화되고 마법의 묵시적 변수 인 $ _에 별명을 띠고 있습니다.

그는 보일러 플레이트 코드 비용으로 더 읽을 수있는 대체물을 제공합니다.

간결성에 대한 가독성을 희생 할 이유가 없습니다. 암시 적 현지화 및 할당을 명시 적 버전으로 바꾸기 만하면됩니다.

sub html_filter {
    local $_ = shift;

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

    return $_;
}

내가 Perl을 잘 몰랐고이 코드를 발견했다면, 나는 문서를보아야한다는 것을 알고 있습니다. $_ 그리고 local-보너스로 perlvar, 몇 가지가 있습니다 현지화의 예 $_.

Perl을 많이 사용하는 사람이라면 위의 내용은 이해하기 쉽습니다.

따라서 여기서 간결하게 가독성을 희생 할 이유가 없습니다.

기본 변수 인 $ _로 $ 텍스트를 별칭하는 데 사용됩니다. 명백한 변수를 사용하기에는 너무 게으르거나 새로운 스칼라를 만드는 귀중한주기를 낭비하고 싶지 않기 때문입니다.

그것의 청소 및 <,> 문자를 인용하고 적절한 HTML 엔티티 숯으로 대체합니다.

그것은 당신의 텍스트를 통해 반복되고 &)를 & <, with with with with "와 함께 앰퍼 샌드 (&)를 대체합니다. .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