Ich möchte in der Lage sein, eine Regex-Übereinstimmung für eine Variable auszuführen und die Ergebnisse der Variablen selbst zuzuweisen. Was ist der beste Weg, dies zu tun?
Ich möchte die Zeilen 2 und 3 im Wesentlichen in einer einzigen Codezeile kombinieren:
$variable = "some string";
$variable =~ /(find something).*/;
$variable = $1;
Gibt es einen kürzeren/einfacheren Weg, dies zu tun? Fehlt mir etwas?
Warum soll es kürzer sein? Ist das wirklich wichtig?
$variable = $1 if $variable =~ /(find something).*/;
Wenn Sie sich Sorgen um den Variablennamen machen oder dies wiederholt machen, wickeln Sie das Ding in eine Subroutine ein und vergessen Sie es:
some_sub( $variable, qr/pattern/ );
sub some_sub { $_[0] = $1 if eval { $_[0] =~ m/$_[1]/ }; $1 };
Wie auch immer Sie es implementieren, der Zweck der Subroutine besteht darin, sie wiederverwendbar zu machen, damit Sie einer bestimmten Menge von Zeilen einen kurzen Namen geben, der an ihrer Stelle steht.
my($variable) = "some string" =~ /(e\s*str)/;
Das funktioniert da
Wenn die Option
/g
nicht verwendet wird, gibtm//
im Listenkontext eine Liste zurück, die aus den mit den Klammern im Muster übereinstimmenden Unterausdrücken besteht: d. H. , ($1
,$2
,$3
…).
und weil my($variable) = ...
(beachten Sie die Klammern um den Skalar) der Übereinstimmung den Listenkontext.
Wenn das Muster nicht übereinstimmt, erhält $variable
den nicht definierten Wert.
Sie können eine Substitution durchführen als:
$a = 'stackoverflow';
$a =~ s/(\w+)overflow/$1/;
$a
ist jetzt "stack"
Nun könnte man sagen
my $variable;
($variable) = ($variable = "find something soon") =~ /(find something).*/;
oder
(my $variable = "find something soon") =~ s/^.*?(find something).*/$1/;
$variable2 = "stackoverflow";
(my $variable1) = ($variable2 =~ /stack(\w+)/);
$variable1
entspricht jetzt "overflow"
.
Fast ....
Sie können den Abgleich kombinieren und den Abgleichwert mit einer Ersetzung abrufen.
$variable =~ s/.*(find something).*/$1/;
AFAIK, Sie müssen den Wert jedoch immer kopieren, es sei denn, Sie möchten das Original nicht beschädigen.
Aus dem Perl-Kochbuch, 2. Aufl 6.1 Gleichzeitiges Kopieren und Ersetzen
$dst = $src;
$dst =~ s/this/that/;
wird
($dst = $src) =~ s/this/that/;
Ich ging einfach davon aus, dass alle das so gemacht haben, und ich war überrascht, dass niemand diese Antwort gab.
Ich mache das:
#!/usr/bin/Perl
$target = "n: 123";
my ($target) = $target =~ /n:\s*(\d+)/g;
print $target; # the var $target now is "123"
Um die akzeptierte Antwort mit dem ternären Operator zu verstärken, können Sie einen Standardwert angeben, wenn keine Übereinstimmung vorliegt:
my $match = $variable =~ /(*pattern*).*/ ? $1 : *defaultValue*;