2017-04-03 4 views
3

Ich versuche, ein Perl-Skript zu Python zu analysieren. Ich habe fast keine Erfahrung mit Perl, aber es geht trotzdem erstaunlich glatt. Die Perl-Dokumentation ist umfangreich und beeindruckend. Aber von Zeit zu Zeit gibt es eine wirklich kryptische Syntax, die ich wirklich nicht verstehen kann, und ich bin nicht in der Lage, mit dem Autor des Skripts zu kommunizieren. Im Folgenden hat mir Kopfschmerzen seit geraumer Zeit jetzt:Was bedeutet diese Perl Aussage?

sub someSubroutine 
{ 
    my ($var1, $var2, $var3) = @_; 

    # some Perl code 

    $var2 =~ s|/|\\|g; 

    # and then some more code .. 
} 

ich diese besondere und einsam nicht wirklich Linie

$dst =~ s|/|\\|g; 

klar Ich bin bekommen, dass es eine Suche/string macht -match in $var2 mit einigen binären ODER-Operationen, aber das Ergebnis wird nicht gespeichert.

Ich frage mich, ob es irgendwelche nicht so offensichtlichen Nebenwirkungen hat, zum Beispiel ist es automatisch in $_ gespeichert?

Von dem, was ich gelesen habe, werden die Standardvariablen automatisch eingestellt, wenn man ein Unterprogramm aufruft, eine Schleife oder ähnliches initiiert, aber nichts über die Verwendung von Operatoren.

Ich würde wirklich jede Hilfe oder Hinweise auf geeignete Dokumentation zu schätzen wissen.

Antwort

8

Im

$var2 =~ s|/|\\|g; 

der s/pattern/replacement/ ist die substitution operator.

Sucht einen String nach einem Muster, und wenn gefunden, ersetzt dieses Muster mit dem Ersetzungstext und gibt die Anzahl der Ersetzungen gemacht. Andernfalls wird false zurückgegeben (insbesondere die leere Zeichenfolge).

Die | ist nicht "binär oder" - es ist ein Trennzeichen ist. In der s können Sie jedes Trennzeichen verwenden, besonders zum leichteren Lesen.

vom perlopRegexp Quote-Like Operators

Alle Nicht-Leerzeichen Begrenzer kann die Schrägstriche ersetzen. Fügen Sie Leerzeichen nach s hinzu, wenn Sie ein Zeichen verwenden, das in Bezeichnern zulässig ist. Wenn die einfachen Anführungszeichen verwendet werden, erfolgt keine Interpretation der Ersetzungszeichenfolge (der/e Modifier/e setzt dies jedoch außer Kraft). Beachten Sie, dass Perl Backticks als normale Begrenzer behandelt; Der Ersetzungstext wird nicht als Befehl ausgewertet. Wenn das PATTERN durch Klammern in Anführungszeichen begrenzt ist, hat der ERSATZ ein eigenes Anführungszeichen, das für Beispiel, s (foo) (bar) oder s/bar/sein kann.

Die obige ersetzt jedes / mit \ im $var2. (Die \ ist Escape-Zeichen, daher müssen Sie \\ verwenden).

my $v='/a/b/c'; 
$v =~ s|/|\\|g; 
print "$v\n"; 
# \a\b\c 

Auch

Wenn keine Zeichenfolge über das = angegeben ~ oder! ~ Operator, die Variable $ _ gesucht und geändert.

$_ = $v;  # assign the $_ 
s{\\}{/}g; # substitution on the $_ using bracketed delimiters 
print;  # without args prints the $_ 
# /a/b/c 
+0

Danke. Bedenke, dass ich die ganze Zeit, die ich durch die Perl-Dokumentation gelesen habe, ziemlich peinlich war, dass ich es nicht selbst herausfinden konnte. In Anbetracht des * Hilfezentrums> Fragen * -Artikel bin ich mir jetzt etwas unsicher, ob ich die Frage löschen sollte, die immerhin nichts als triviale Syntax war. – magnus

+2

@Magnus, muss nicht gelöscht werden. – ikegami