Comment remplacer $ * = 1 par une alternative maintenant $ * n'est plus pris en charge

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

  •  01-07-2019
  •  | 
  •  

Question

Je suis un novice en Perl complet, j'exécute un script Perl à l'aide de Perl 5.10 et je reçois cet avertissement:

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

Quelqu'un peut-il décrire ce que $ * a fait et quel est le remplacement recommandé? Sinon, si vous pouviez me diriger vers la documentation qui décrit cela, ce serait formidable.

Le script que je suis en train d’exécuter est de migrer une base de données de code source de vss vers svn et peut être trouvé ici: http://www.x2systems.com/files/migrate.pl.txt

Les deux extraits de code qui l'utilisent sont les suivants:

    $* = 1;
    $/ = ':';

    $cmd = $SSCMD . " Dir -I- \"$proj\"";
    

Je suis un novice en Perl complet, j'exécute un script Perl à l'aide de Perl 5.10 et je reçois cet avertissement:

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

Quelqu'un peut-il décrire ce que $ * a fait et quel est le remplacement recommandé? Sinon, si vous pouviez me diriger vers la documentation qui décrit cela, ce serait formidable.

Le script que je suis en train d’exécuter est de migrer une base de données de code source de vss vers svn et peut être trouvé ici: http://www.x2systems.com/files/migrate.pl.txt

Les deux extraits de code qui l'utilisent sont les suivants:

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

et quelques manières plus tard:

<*>

merci beaucoup,

  • Rory
= `$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;

et quelques manières plus tard:

<*>

merci beaucoup,

  • Rory
Était-ce utile?

La solution

De perlvar :

  

L'utilisation de $ * est déconseillée dans Perl moderne, et supplantée par les modificateurs / s et / m lors de la mise en correspondance des modèles.

Si vous avez accès à l'endroit où il correspond, ajoutez-le simplement à la fin:

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

Si vous avez uniquement accès à la chaîne, vous pouvez entourer l'expression avec

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

Ou dans votre cas:

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

Autres conseils

De la version Perl 5.8 de perlvar :

  

Définir une valeur entière non nulle à faire   correspondance multiligne dans une chaîne   [...] L'utilisation de $ * est déconseillée dans   Perl moderne, supplanté par le / s et   / m modificateurs sur la correspondance de modèle.

Bien que l'utilisation de / s et / m soit bien meilleure, vous devez définir les modificateurs (de manière appropriée!) pour chaque expression régulière.

perlvar indique également "Cette variable influence uniquement l'interprétation de ^ et $." , ce qui donne l'impression qu'elle est équivalente à / m uniquement et non / s.

Notez que $ * est une variable globale. Étant donné que la modification apportée n’est pas locale avec le mot clé local , cela affectera toutes les expressions régulières dans le programme, et pas uniquement celles qui le suivent dans le bloc. Cela rendra plus difficile la mise à jour correcte du script.

De perldoc perlvar :

  

$ *

     

Définissez une valeur entière non nulle pour effectuer une correspondance sur plusieurs lignes dans une chaîne, 0 (ou undefined) pour indiquer à Perl qu'il peut supposer que les chaînes contiennent une seule ligne, dans le but d'optimiser les correspondances de modèles. Les correspondances de modèle sur des chaînes contenant plusieurs nouvelles lignes peuvent produire des résultats confus lorsque $ * est égal à 0 ou non défini. La valeur par défaut est indéfinie. (Mnémonique: * correspond à plusieurs éléments.) Cette variable influence uniquement l'interprétation de ^ et de $ . Une nouvelle ligne littérale peut être recherchée même lorsque $ * == 0 .

     

L'utilisation de $ * est déconseillée dans Perl moderne, supplantée par les modificateurs / s et / m pour la correspondance de modèle.

     

L'attribution d'une valeur non numérique à $ * déclenche un avertissement (et fait que $ * agit comme si $ * == 0 ) , lors de l'attribution d'une valeur numérique à $ * , un int implicite est appliqué à la valeur.

C’était essentiellement une façon de dire que dans les expressions rationnelles suivantes (s /// ou m //), les assertions ^ ou $ devraient pouvoir correspondre avant ou après les nouvelles lignes incorporées dans la chaîne.

L'équivalent recommandé est le modificateur m à la fin de votre regex (par exemple, s / \ n ((\ w * - *. * w * / *) +:) / $ 1 / gm;).

Il active le mode multiligne. Depuis Perl 5.0 (à partir de 1994), la bonne façon de faire est d’ajouter un m et / ou le s modifiez vos expressions rationnelles, comme ceci

 s/\n?Project.*rebuilt\.//msg
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top