Como substituir $ * = 1 com uma alternativa agora $ * não é mais suportada

StackOverflow https://stackoverflow.com/questions/88518

  •  01-07-2019
  •  | 
  •  

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
Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top