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

関連情報