Perl은 $ 앞에 오는 하위 문자열을 제거합니다.

Perl은 $ 앞에 오는 하위 문자열을 제거합니다.

$Perl은 문자열의 일부를 Perl 변수로 간주한다는 것을 알고 있습니다 . Perl 호출로 수행하려는 작업은 $as 앞에 오는 변수를 재정의하는 것이지만 \$이로 인해 다른 오류가 발생합니다. 내 주장의 순서가 잘못되어 뭔가 문제가 있다고 생각합니다.

내 코드는 다음과 같습니다

perl -0pE "use strict; my $repo = "\$repo"; my $arch = "\$arch"; 
s|\rsync:\/\/[^\]]+|"${linesToWrite}"|"

내가받는 컴파일러 경고는 다음과 같습니다. Can't use global $! in "my" at -e line 1, near "-p destination: $!"

Perl 문서에서 이를 처리하는 방법을 자세히 설명하는 많은 문서를 찾았지만 bash의 문제에 대한 솔루션에 대해서는 많지 않았습니다.

나는 이것을 시도했지만 모든 것이 망가졌습니다.

perl ""my $repo = "\$repo"; my $arch = "\$arch"" -0pE "use strict; 
s|\"rsync:\/\/[^\]+|"${linesToWrite}"|" 

Perl이 문자열에서 "$"를 제거하는 것을 방지하고 엄격한 사용을 활성화한 상태로 컴파일하도록 하려면 형식을 올바르게 지정하려면 어떻게 해야 합니까?

답변1

$repo $arch쉘 변수 와 확장 만 필요하다고 가정하면 $linesToWrite큰따옴표로 묶고 나머지는 작은따옴표로 묶으십시오. 서로 옆에 따옴표 붙은 문자열은 문자열을 형성합니다("a"'b'는 ab입니다). (대체 명령에서 백슬래시를 사용하여 무엇을 하는지 모르기 때문에 그대로 두었지만 아마도 원하지 않을 것입니다.)

perl -0pE 'use strict; my $repo = "'"$repo"'"; my $arch = "'"$arch"'"; 
s|\rsync:\/\/[^\]]+|'"${linesToWrite}"'|'

답변2

Perl은 %ENV해시를 통해 내보낸 쉘 변수에 액세스할 수 있습니다. 사용하는 것이 훨씬 간단할 수 있습니다. 그것은 다음과 같습니다:

$ export repo arch linesToWrite
$ perl -0pE 'use strict; my $repo = $ENV{"repo"}; my $arch = $ENV{"arch"}; 
             s|\rsync:\/\/[^\]]+|$ENV{"linesToWrite"}|'

이 표현으로 무엇을 하려는지 이해가 되지 않습니다. 정말로 일치시키겠습니까 \r(개행, 이것은 Windows의 파일입니까?) 아니면 그 것입니까 rsync? 구분 기호 /로 사용하는 경우 |왜 이스케이프 처리합니까? 게다가 use strict단일 안감을 선택할 이유도 많지 않습니다 . 나는 아마도 모든 것을 다음과 같이 단순화할 것입니다.

 perl -0pE '$repo = $ENV{"repo"}; $arch = $ENV{"arch"}; 
         s|\rsync://[^\]]+|$ENV{"linesToWrite"}|'

아니면 이런 것들은 잊어버리고 $repo=$ENV{"repo"}그냥 사용하는 것이 더 좋습니다.$ENV{"repo"}$ENV{"arch"}

관련 정보