Perl stripping substring com $ na frente

1

Eu entendo que o perl acha que a parte da string com $ são variáveis perl. O que estou tentando fazer com a chamada perl é redefinir variáveis precedidas por $ as \$ , mas isso gera outros erros. Eu acho que tenho um problema com argumentos que estão na ordem errada.

O código que tenho é:

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

O aviso do compilador que estou recebendo é Can't use global $! in "my" at -e line 1, near "-p destination: $!"

Encontrei muitos detalhes da documentação sobre como lidar com isso em um documento do perl, mas não muito sobre a solução para encontrar problemas no bash.

Eu tentei fazer isso, mas isso acabou com tudo:

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

Como eu formataria corretamente isso para evitar que o perl extraísse o '$' de strings e conseguisse compilar com o uso restrito ativado?

    
por ZeroPhase 16.06.2016 / 08:11

2 respostas

1

Supondo que você queira apenas as variáveis de shell $repo $arch e $linesToWrite expanded, coloque-as entre aspas duplas e o resto entre aspas simples. As strings entre aspas uma ao lado da outra formam uma única string ("a" 'b' é ab). (Eu não sei o que você está fazendo com as barras invertidas no comando substituto, então eu as deixei, mas você provavelmente não as quer).

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

O Perl tem acesso a variáveis de shell exportadas por meio do hash %ENV . Provavelmente seria muito mais simples usar isso. Algo como:

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

Eu não entendo o que você está tentando fazer com essa expressão. Você está realmente tentando corresponder \r (feed de linha, isso é um arquivo vindo do Windows?) Ou é rsync ? Por que você está escapando do / se estiver usando | como separador? Além disso, não há realmente muita razão para use strict em um dos liners. Eu provavelmente simplificaria a coisa toda para:

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

Ou, melhor ainda, esqueça o material $repo=$ENV{"repo"} e use apenas $ENV{"repo"} , $ENV{"arch"} etc. diretamente.

    
por 16.06.2016 / 11:50