Sparen Sie Abgestimmt Perl-Regex-Variable
Habe ich ein einfaches Perl-regex, die ich brauche, zu retten, als eine variable.
Wenn ich es ausdrucken:
print($html_data =~ m/<iframe id="pdfDocument" src=.(.*)pdf/g);
Er druckt, was ich will, um zu sparen, aber wenn man versucht, es zu retten mit:
$link = $html_data =~ m/<iframe id="pdfDocument" src=.(.*)pdf/g;
Bekomme ich wieder eine '1' als der Wert der $link
. Ich nehme an, dies ist, weil es gefunden - '1' entsprechen. Aber wie Speichere ich den Inhalt der match statt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den übereinstimmenden Teilausdrücke von einem Muster sind gespeichert in der Variablen
$1
,$2
usw. Sie können auch das gesamte aufeinander abgestimmte Muster ($&
) aber das ist teuer und sollte vermieden werden.Den Unterschied im Verhalten hier, durch die Art und Weise, ist das Ergebnis von skalaren vs. Liste Kontext; Sie sollten Sie kennenlernen, wie Sie sich unterscheiden, und wie Sie Einfluss auf das Verhalten der verschiedenen Perl-Ausdrücke.
$&
. Es verlangsamt jeden regex nicht erfasst in Ihrem gesamten Programm. Nein, das hat sich nicht geändert in den neueren Perl-version, so dass ich gelöscht, die etwas aus Ihrem post. Wenn Sie wollen, dass etwas nicht haben, der Nachteil ist, verwenden Sie /p und${^MATCH}
. Siehe perlvar für die Dokumentation für diese Variablen.Hinweis: die /g, um alle Spiele. Die können doch unmöglich in einen Skalar. Benötigen Sie ein array.
Wenn Sie wollen einfach nur das erste match:
Hinweis: die Klammern (und die fehlen jetzt-nutzlos /g). Man braucht Sie zum call m//in Listen-Kontext.
my $link = $html_data =~ m/.../ ? $1 : undef;
)Vom 'perlfunc' docs:
LISTE drucken
Druckt einen string oder eine Liste von strings.
So,
print m//
, wo die m//legt fest, dass der Rückgabewertwollte (wantarray?) ist eine Liste
(Es appers m//ohne capture-Gruppen gibt 1 oder 0 entsprechen, pass
oder scheitern, wo Sie als m//g liefert eine Liste von Treffern).
und
$link
= m//können nur Skalare (im Gegensatz zu list) Kontext.So, m//liefert match-Ergebnisse 1 (wahr) oder 0 (false).
Schrieb ich einfach einen code wie diesen. Es kann helfen. Es ist im Grunde so wie Euch außer mir hat noch ein paar mehr Klammern.
So dass Ihnen aus diesem Beispiel kann so etwas sein, wenn Ihr versucht zu speichern, die ganze Sache? Ich bin mir nicht sicher, aber können Sie mir ein Beispiel. Ich bin zu speichern, was in (\w+):