Perl regex: Verwendung von $&
Lerne ich perl und regex. Die folgenden code:
my $data = "Bule beatles battling a blowing breeze";
my $results = $data =~ m/beatles battling/;
print "results: $results\n";
erzeugt diese Ausgabe:
C:\scripts\perl\sandbox>regex.pl
results: 1
Mit einer kleinen änderung, ich bekomme die Ergebnisse die ich will:
print "results: $&\n";
results: beatles battling
Mir ist auch aufgefallen, dass ich nicht brauchen, zu erstellen, $Ergebnisse:
my $data = "Bule beatles battling a blowing breeze";
$data =~ m/beatles battling/;
print "results: $&\n";
In den verschiedenen perl-tutorials, die ich gelesen habe, einige Beispiele, verwenden Sie die folgende syntax:
my $results = $data =~ m/string_to_match/;
Meine Fragen:
- Wann sollte man erstellen $Ergebnis statt direkt tun, ein regex auf $data?
- Warum erhalte ich eine "1" zurück, wenn ich versuchen zu drucken, $Daten? (Ich denke, es ist Rückkehr die Länge der Spiele...)
- Ist es nützlich, um $Ergebnisse? Wenn Nein, wie würde ich das Angebot mit mehreren Ergebnissen?
Beispiel:
my $data = "Bule beatles battling a blowing breeze";
my $results1 = $data =~ m/beatles/;
my $results2 = $data =~ m/battling/;
Vielen Dank 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Manchmal, Sie würde wissen wollen, ob es eine übereinstimmung gibt oder nicht, und diese (auch die Beantwortung Ihrer zweiten Frage) ist, was
1
ist. Deshalb, wenn es eine übereinstimmung gibt, bekommt man1
, und0
wenn Sie nicht bekommen, keine Spiele.Ich glaube, ich beantwortete diese oben 🙂
Ich persönlich habe nur selten gespeichert, der Wert
1
oder0
in eine variable. Ein mögliches Szenario, das ich denke, könnte sein, wenn Sie mit dem regulären Ausdruck in eine Funktion, die enthält eine Reihe von Validierungen und dann vergleichen Sie das Ergebnis mit dem Ergebnis der anderen Validierungen, zu erkennen, ob die Funktion true zurück oder nicht (oder gültig ist oder nicht).Habe ich mich mehr mit match regex in
if()
. Vielleicht so etwas wie...Für dein Beispiel:
Könnte man vergleichen
$results1
und$results2
zu schließen, ob der string$data
enthält sowohl die Wortebeatles
undbattling
überall in der Zeichenfolge.Können Sie einen Lesevorgang durch auf dieser Seite beschreibt die verschiedenen spezielle Variablen in perl und finden Sie es, dass
$&
enthält der string abgestimmt, die von der letzten Muster übereinstimmen. In deinem Beispiel, denn die laufen beide regexes, erhalten Sie$& = "battling"
und nichtbeatles
.Einem normalen regex-match in skalaren Kontext gibt einen booleschen Wert zurück, der angibt, ob das Muster abgestimmt. Es nicht zurück, wird der übereinstimmende Teilstring (ineffizient!).
Zugriff auf die übereinstimmenden Teilstring, schließen Sie das Muster in Klammern. Der Inhalt der Muster stehen dann im
$1
oder wie der erste Rückgabewert in Liste Kontext:Ausgabe:
beatles battling
.Wenn du mehr erfasst, die in Ihre Muster, Ihre Inhalte werden in
$2
,$3
, .... Sie können auch Zugang zu Ihnen über die Liste Kontext:Verwenden Sie niemals
$&
, außer vielleicht beim Golfen, oder auf einen one-liner, wo Effizienz-oder guter Stil ist keine Frage.Nutzung von
$&
etc. erlegt Aufwand auf alle musterübereinstimmungen weltweit. Das wollen Sie nicht.