$
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"}