Domanda

Sono un principiante assoluto del Perl, sto eseguendo uno script Perl utilizzando Perl 5.10 e ricevo questo avviso:

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

Qualcuno può descrivere cosa ha fatto $* e qual è la sua sostituzione consigliata ora?In alternativa, se potessi indicarmi la documentazione che lo descrive, sarebbe fantastico.

Lo script che sto eseguendo serve per migrare un database del codice sorgente da vss a svn e può essere trovato qui:http://www.x2systems.com/files/migrate.pl.txt

I due frammenti di codice che lo utilizzano sono:

    $* = 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 poi in qualche modo più tardi:

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

grazie molto,

  • Rory
È stato utile?

Soluzione

Da perlvar:

L'uso di $* è deprecato nel Perl moderno, soppiantato dai modificatori /s e /m sulla corrispondenza dei modelli.

Se hai accesso al luogo in cui viene abbinato, aggiungilo semplicemente alla fine:

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

Se hai accesso solo alla stringa, puoi racchiudere l'espressione con

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

O nel tuo caso:

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

Altri suggerimenti

Da Versione Perl 5.8 di perlvar:

Impostare su un valore intero diverso da zero per eseguire la corrispondenza multi-riga all'interno di una stringa [...] l'uso di $* è deprecato nella moderna perl, soppiantato dai modificatori /s e /m sulla corrispondenza del pattern.

Anche se usare /s e /m è molto meglio, è necessario impostare i modificatori (in modo appropriato!) per ciascuna espressione regolare.

dice anche perlvar "Questa variabile influenza solo l'interpretazione di ^ e $." che dà l'impressione che sia equivalente solo a /m e non a /s.

Notare che $* è una variabile globale.Poiché la modifica ad esso non viene apportata localmente con il file local parola chiave, influenzerà Tutto espressioni regolari nel programma, non solo quelle che lo seguono nel blocco.Ciò renderà più difficile aggiornare correttamente lo script.

Da perldoc perlvar:

$*

Impostato su un valore intero diverso da zero per eseguire corrispondenze su più righe all'interno di una stringa, 0 (o undefinito) per indicare a Perl che può assumere che le stringhe contengano una singola riga, allo scopo di ottimizzare le corrispondenze dei modelli.Le corrispondenze di pattern su stringhe contenenti più caratteri di fine riga possono produrre risultati confusi quando $* è 0 o indefinito.L'impostazione predefinita non è definita.(Mnemonico: * corrisponde a più cose.) Questa variabile influenza solo l'interpretazione di ^ E $.È possibile cercare una nuova riga letterale anche quando $* == 0.

Utilizzo di $* è deprecato nel Perl moderno, soppiantato dal /s E /m modificatori sulla corrispondenza dei modelli.

Assegnazione di un valore non numerico a $* attiva un avviso (e rende $* agire come se $* == 0), mentre si assegna un valore numerico a $* fa sì che al valore venga applicato un int implicito.

Fondamentalmente era un modo per dire che nelle espressioni regolari successive (s/// o m//), le asserzioni ^ o $ dovrebbero essere in grado di corrispondere prima o dopo i caratteri di fine riga incorporati nella stringa.

L'equivalente consigliato è il modificatore m alla fine della regex (ad esempio, s/ ((\w*-*.*\w*/*)+:)/$1/gm;).

Attiva la modalità multilinea.Dal perl 5.0 (dal 1994), il modo corretto per farlo è aggiungere a m e/o il s modificatore alle tue espressioni regolari, come questo

 s/\n?Project.*rebuilt\.//msg
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top