Como substituir $ * = 1 com uma alternativa agora $ * não é mais suportada
Pergunta
Eu sou um novato perl completa, estou executando um script perl usando Perl 5.10 e recebendo esse aviso:
$* is no longer supported at migrate.pl line 380.
Alguém pode descrever o que $ * fez eo que a substituição recomendada de que é agora? Alternativamente, se você poderia apontar-me a documentação que descreve este que seria ótimo.
O script que eu estou correndo é migrar um banco de dados de código-fonte de VSS para SVN e pode ser encontrado aqui: http://www.x2systems.com/files/migrate.pl.txt
Os dois trechos de código que o utilizam são:
$* = 1;
$/ = ':';
$cmd = $SSCMD . " Dir -I- \"$proj\"";
$_ = `$cmd`;
# what this next expression does is to merge wrapped lines like:
# $/DeviceAuthority/src/com/eclyptic/networkdevicedomain/deviceinterrogator/excep
# tion:
# into:
# $/DeviceAuthority/src/com/eclyptic/networkdevicedomain/deviceinterrogator/exception:
s/\n((\w*\-*\.*\w*\/*)+\:)/$1/g;
$* = 0;
e, em seguida, algumas formas posteriores em:
$cmd = $SSCMD . " get -GTM -W -I-Y -GL\"$localdir\" -V$version \"$file\" 2>&1";
$out = `$cmd`;
# get rid of stupid VSS warning messages
$* = 1;
$out =~ s/\n?Project.*rebuilt\.//g;
$out =~ s/\n?File.*rebuilt\.//g;
$out =~ s/\n.*was moved out of this project.*rebuilt\.//g;
$out =~ s/\nContinue anyway.*Y//g;
$* = 0;
muitas graças,
- Rory
Solução
A partir perlvar :
Use de US $ * é obsoleto em Perl moderno, suplantado pelo / s e m modificadores / na correspondência de padrão.
Se você tem acesso ao local onde está sendo acompanhado apenas adicioná-lo até o fim:
$haystack =~ m/.../sm;
Se você só tem acesso para a cadeia, você pode cercar a expressão com
qr/(?ms-ix:$expr)/;
Ou no seu caso:
s/\n((\w*\-*\.*\w*\/*)+\:)/$1/gsm;
Outras dicas
A partir Perl 5.8 versão do perlvar :
definida para um valor inteiro diferente de zero a fazer multi-linha dentro de uma string [...] O uso de $ * é obsoleto em moderno Perl, suplantado pelo / s e / M modificadores de correspondência de padrões.
Enquanto estiver usando / s e / m é muito melhor, você precisa definir os modificadores (adequadamente!) Para cada expressão regular.
perlvar também diz "Esta variável influencia a interpretação de apenas ^ e $." que dá a impressão de que é equivalente a / m somente e não / s.
Note que $*
é uma variável global. Porque a mudança não é feito local com a palavra-chave local
, que irá afectar todas expressões regulares no programa, não apenas aqueles que segui-lo no bloco. Isto irá tornar mais difícil para atualizar o script corretamente.
A partir perldoc perlvar :
$*
definida para um valor diferente de zero inteiro para fazer a correspondência de várias linhas dentro de uma cadeia, 0 (ou indefinido) para dizer Perl que ele pode assumir que strings contêm uma única linha, com a finalidade de otimizar partidas padrão. Padrão corresponde a cadeias contendo várias mudanças de linha pode produzir resultados confusos quando
$*
é 0 ou indefinido. Padrão é indefinido. (Mnemonic:*
combina várias coisas.) Esta variável influencia a interpretação de apenas^
e$
. Uma nova linha literal pode ser procurado mesmo quando$* == 0
.O uso de
$*
está obsoleta em Perl moderno, suplantado pelos modificadores/s
e/m
na correspondência de padrão.Atribuindo um valor não numérica a disparadores
$*
um aviso (e faz$*
ato como se$* == 0
), enquanto que a atribuição de um valor numérico para$*
marcas que um int implícita é aplicado sobre o valor.
Foi basicamente uma forma de dizer que em expressões regulares subsequentes (s /// ou m //), o ^ ou $ afirmações deve ser capaz de igualar antes ou depois de novas linhas embutidas na string.
O equivalente recomendado é o modificador m no final da sua expressão regular (por exemplo, s / \ n ((\ w * - * * \ w * / *) +:.) / $ 1 / g;).
Acontece em modo multi-line. Desde perl 5.0 (de 1994), a maneira correta de fazer isso é adicionar um m
e / ou s
modificador para seus regexps, como este
s/\n?Project.*rebuilt\.//msg