wake-up-neo.com

Passen Sie den regulären Ausdruck an und weisen Sie die Ergebnisse in einer einzigen Codezeile zu

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?

37
user354606

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.

25
brian d foy
my($variable) = "some string" =~ /(e\s*str)/;

Das funktioniert da 

Wenn die Option /g nicht verwendet wird, gibt m// 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.

55
Greg Bacon

Sie können eine Substitution durchführen als:

$a = 'stackoverflow';
$a =~ s/(\w+)overflow/$1/;

$a ist jetzt "stack"

7
codaddict

Nun könnte man sagen

my $variable;
($variable) = ($variable = "find something soon") =~ /(find something).*/;

oder

(my $variable = "find something soon") =~ s/^.*?(find something).*/$1/;
6
Chas. Owens
$variable2 = "stackoverflow";
(my $variable1) = ($variable2 =~ /stack(\w+)/);

$variable1 entspricht jetzt "overflow".

4

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.

4
Peter Tillemans

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.

3
user3287506

Ich mache das: 

#!/usr/bin/Perl

$target = "n: 123";
my ($target) = $target =~ /n:\s*(\d+)/g;
print $target; # the var $target now is "123"
3
Jet

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*;
0
atrobinson