11 Stimmen

Wie weise ich das Ergebnis eines Regex-Matches einer neuen Variablen in einer einzigen Zeile zu?

Ich möchte in nur einer Zeile übereinstimmen und einer Variable zuweisen:

my $abspath='/var/ftp/path/to/file.txt';

$abspath =~ #/var/ftp/(.*)$#;
my $relpath=$1;

Ich bin mir sicher, es muss einfach sein.

18voto

Qtax Punkte 32095
mein ($relpath) = $abspath =~ m#/var/ftp/(.*)$#;

In Listen-Kontext gibt das Match die Werte der Gruppen zurück.

17voto

daxim Punkte 38607

Obligatorischer Clippy: "Hallo! Ich sehe, dass du Pfadmanipulation in Perl durchführst. Möchtest du stattdessen Path::Class verwenden?"

use Path::Class qw(file);
my $abspath = file '/var/ftp/path/to/file.txt';
my $relpath = $abspath->relative('/var/ftp');
# gibt "path/to/file.txt" im String-Kontext zurück

9voto

Francisco R Punkte 3947

Sie können dies mit dem Match- und Ersetzungsoperator erreichen:

(my $relpath = $abspath ) =~ s#/var/ftp/(.*)#$1# ;

Dieser Code weist $abspath $relpath zu und wendet dann das Regex darauf an.

Bearbeiten: Qtax-Antwort ist eleganter, wenn Sie nur einfache Übereinstimmungen benötigen. Wenn Sie jemals komplexe Ersetzungen benötigen (wie ich normalerweise), verwenden Sie einfach meinen Ausdruck.

5voto

mirod Punkte 15573

Mit Perl 5.14 können Sie auch den /r (nicht destruktiven Substitutions-) Modifikator verwenden:

perl -E'my $abspath="/var/ftp/path/to/file.txt"; \
        my $relpath= $abspath=~ s{/var/ftp/}{}r; \
        say "abspath: $abspath - relpath: $relpath"'

Weitere Beispiele finden Sie unter "Neue Funktionen von Perl 5.14: Nicht-destruktive Substitution".

0voto

dolmen Punkte 7171

Da Sie nur den Anfang des Strings entfernen möchten, könnten Sie den Ausdruck optimieren:

(my $relpath = $abspath) =~ s#^/var/ftp/##;

Oder sogar:

my $relpath = substr($abspath, 9);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X