Wie man jetzt $ $ * = 1 mit einem alternativen ersetzen * wird nicht mehr unterstützt

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

  •  01-07-2019
  •  | 
  •  

Frage

Ich bin einen kompletten Perl-Neuling, leitet ein Perl-Skript Perl 5.10 verwenden und immer diese Warnung:

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

Kann mir jemand beschreiben, was * $ hat und was die empfohlene Ersatz der es jetzt ist? Alternativ, wenn Sie mich auf die Dokumentation verweisen könnte, die dies beschreibt das wäre toll.

Das Skript, das ich laufe bin ist eine Quellcode-Datenbank von vss zu SVN wandern und hier gefunden werden kann: http://www.x2systems.com/files/migrate.pl.txt

Die beiden Code-Schnipsel, die sie verwenden sind:

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

und dann später einige Möglichkeiten auf:

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

Vielen Dank,

  • Rory
War es hilfreich?

Lösung

perlvar :

  

Die Verwendung von $ * in modernen Perl veraltet ist, durch die / s und / m Modifikatoren auf Pattern-Matching verdrängt.

Wenn Sie den Zugriff auf den Ort, wo es nur um es zu Ende hinzufügen abgestimmt ist wird:

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

Wenn Sie nur den Zugriff auf die Zeichenfolge haben, können Sie den Ausdruck umgeben mit

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

oder in Ihrem Fall:

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

Andere Tipps

Perl 5.8 Version von perlvar :

  

Stellen Sie auf einen Nicht-Null-Integer-Wert zu tun   mehrzeiligen Anpassung innerhalb eines Strings   [...] Die Verwendung von $ * ist veraltet in   modernes Perl, durch die / s verdrängte und   / M Modifikatoren auf Pattern-Matching.

Während / s und / m ist viel besser, müssen Sie die Modifikatoren einzustellen (entsprechend!) Für jeden regulären Ausdruck.

perlvar sagt auch "Diese Variable die Auslegung von nur ^ und $ beeinflusst." , die den Eindruck erweckt, dass es / m äquivalent ist nur und nicht / s.

Beachten Sie, dass $* eine globale Variable ist. Da die Änderung nicht mit dem local Stichwort lokalen gemacht wird, wird es Auswirkungen auf alle reguläre Ausdrücke im Programm, nicht nur diejenigen, die es in dem Block folgen. Dadurch wird es schwieriger, das Skript korrekt zu aktualisieren.

Perldoc perlvar :

  

$*

     

Stellen Sie auf einen Nicht-Null-Integer-Wert mehrzeiligen Anpassung innerhalb einer Zeichenkette, 0 (oder nicht definiert ist) zu tun, Perl zu sagen, dass es annehmen kann, dass Strings eine einzige Zeile, zum Zweck der Optimierung der Muster entsprechen enthalten. Muster passt auf Strings mehrere Zeilenumbrüche enthält, kann verwirrend Ergebnisse, wenn $* 0 oder nicht definiert ist. Der Standardwert ist nicht definiert. (Mnemonic: Spiele * mehrere Dinge.) Diese Variable beeinflusst die Interpretation von nur ^ und $. Eine wörtliche Newline kann, selbst wenn $* == 0 gesucht werden.

     

Die Verwendung von $* ist in modernem Perl veraltet, durch den /s und /m Modifikatoren auf Pattern-Matching verdrängt.

     

einen nicht-numerischen Wert $* Zuweisen löst eine Warnung (und macht $* handeln, als ob $* == 0), während ein Zahlenwert $* Zuordnung macht, daß ein impliziter int auf dem Wert angewendet wird.

Es war im Grunde eine Art zu sagen, dass in der nachfolgenden Regexes (s /// oder m //) sollten die ^ oder $ Behauptungen vor oder nach Zeilenumbrüchen in der Zeichenfolge eingebettet übereinstimmen können.

Die empfohlene äquivalent ist der m-Modifikator am Ende Ihrer regex (zB s / \ n ((\ w * - * * \ w * / *) +.) / $ 1 / gm;).

Es stellt sich auf Multi-Line-Modus. Seit Perl 5.0 (ab 1994), der richtige Weg, das zu tun, ist das Hinzufügen von einer m und / oder s Modifikator auf Ihre regexps, wie diese

 s/\n?Project.*rebuilt\.//msg
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top