캡처링 그룹이 하나만 발견된 경우 $1과 $& Perl의 차이점

캡처링 그룹이 하나만 발견된 경우 $1과 $& Perl의 차이점

내가 아는 한, $&이것이 마지막으로 발견된 캡처 그룹입니다. 캡처 그룹이 하나만 있는 경우 동일한 두 변수를 반환하는 것은 어떨까요? 예를 들어:

$ echo "key: value" | perl -ne "s/([a-z]+)(?=:)/\"$1\"/; print;" 
"": value
$ echo "key: value" | perl -ne "s/([a-z]+)(?=:)/\"$&\"/; print;"
"key": value

답변1

perl특수 변수는 에 기록됩니다 perldoc perlvar.

호출기가 있는 경우 less(줄 시작 부분에서) 검색하여 관련 섹션에 접근할 수 있습니다.$&^\s*\$&$&

또는 perldoc -v '$&'변수에 대한 특정 부분을 추출 하려면 다음을 수행하십시오 $&.

$&      The string matched by the last successful pattern match (not
        counting any matches hidden within a BLOCK or "eval()" enclosed
        by the current BLOCK).

        See "Performance issues" above for the serious performance
        implications of using this variable (even once) in your code.

        This variable is read-only and dynamically-scoped.

        Mnemonic: like "&" in some editors.

따라서 여기에는 캡처 그룹에서 캡처한 내용이 포함되지 않고 전체 정규식이 일치하는 내용이 포함됩니다.

어쨌든, 당신의 질문 $1쉘로 확장첫 번째 위치 인수(귀하의 경우 설정되지 않은 것처럼 보임)에 셸에서 유효한 변수 이름이 아니기 $&때문에 단독으로 남겨집니다 .$&

내부적으로 작은따옴표를 사용하려고 하는데, 이는 $셸에서 특별한 의미를 잃습니다.

echo 'key: value' | perl -pe 's/([a-z]+):/"$1":/'
echo 'key: value' | perl -pe 's/[a-z]+(?=:)/"$&"/'

보다 일반적으로, 거의 항상 단일(강한perl) 또는 다른 언어 해석기 의 코드 매개변수 ( sed -e, awk, , ...) 와 관련 되어 있습니다. 이러한 언어에는 일반적으로 쉘에도 특별한 문자가 포함되어 있을 뿐만 아니라 그렇게 하지 않으면 쉘 확장( 첫 번째 위치 인수로 여기에서 확장하는 것과 같은)을 수행하면 이는 빠르게 코드 주입 취약점이 될 수 있습니다( 여기에 포함 되면 어떤 일이 일어날지 생각해 보세요 ).python -csh -c$1$1/;system "reboot" #

관련 정보