Pregunta

Soy un completo perl novato, estoy ejecutando un script en perl usando perl 5.10 y conseguir esta advertencia:

$* is no longer supported at migrate.pl line 380.

Nadie puede describir lo $ * ¿y cuál es el recomendado reemplazo de lo que es ahora?Alternativamente, si usted puede me apunto a la documentación que se describe en este que sería genial.

El script que estoy corriendo es migrar el código fuente de la base de datos de vss para svn y se puede encontrar aquí:http://www.x2systems.com/files/migrate.pl.txt

Los dos fragmentos de código que uso son:

    $* = 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;

y, a continuación, algunas de las formas más adelante:

            $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;

muchas gracias,

  • Rory
¿Fue útil?

Solución

De perlvar:

El uso de la $* está en desuso en la moderna Perl, suplantada por la /s /m modificadores en la coincidencia de patrones.

Si usted tiene acceso al lugar donde se está emparejado sólo tienes que añadir al final:

 $haystack =~ m/.../sm;

Si sólo tiene acceso a la cadena, se puede escribir la expresión con

 qr/(?ms-ix:$expr)/;

O, en su caso:

s/\n((\w*\-*\.*\w*\/*)+\:)/$1/gsm;

Otros consejos

De Perl 5.8 versión de perlvar:

Establece en un valor entero distinto de cero para hacer multi-línea de coincidencia dentro de una cadena [...] La utilización de $* está en desuso en moderno Perl, suplantada por la /s y /m modificadores en la coincidencia de patrones.

Mientras que el uso de /s /m es mucho mejor, es necesario establecer los modificadores (apropiadamente!) para cada expresión regular.

perlvar también dice "Esta variable influye en la interpretación de sólo ^ y $." que da la impresión de que es equivalente a /m y no sólo /s.

Tenga en cuenta que $* es una variable global.Porque el cambio no se hizo de local con el local palabra clave, va a afectar todos expresiones regulares en el programa, no sólo a aquellos que siguen en el bloque.Esto hará que sea más difícil de actualizar el script correctamente.

De perldoc perlvar:

$*

Establece en un valor entero distinto de cero para hacer multi-línea de coincidencia dentro de una cadena, 0 (o indefinido) para decirle a Perl que puede suponer que las cadenas contienen una sola línea, con el propósito de optimizar el patrón de los partidos.Las coincidencias de patrones en cadenas con múltiples saltos de línea puede producir resultados confusos cuando $* es de 0 o indefinido.Por defecto no está definido.(Mnemotécnico: * coincide con varias de las cosas.) Esta variable influye en la interpretación de solo ^ y $.Un literal de salto de línea se puede buscar incluso cuando $* == 0.

El uso de $* está en desuso en la moderna Perl, suplantado por el /s y /m modificadores en la coincidencia de patrones.

La asignación de un valor no numérico para $* activa una advertencia (y hace $* actuar como si $* == 0), mientras que la asignación de un valor numérico a $* hace que un implícita de tipo int se aplica sobre el valor.

Era básicamente una manera de decir que en los años siguientes expresiones regulares (s/// o m//), la ^ o $ afirmaciones deben ser capaces de igualar antes o después de los saltos de línea integrado en la cadena.

El equivalente recomendado es el m modificador al final de la expresión regular (por ejemplo, s/ ((\w*-*.*\w*/*)+:)/$1/gm;).

Se convierte en multi-modo de la línea.Desde perl 5.0 (desde 1994), la forma correcta de hacerlo es la adición de un m y/o la s modificador a su regex, como este

 s/\n?Project.*rebuilt\.//msg
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top