2012-04-11 14 views
3

Ich habe eine einfache Perl Regex, die ich als Variable speichern muss.Matched Perl Regex als Variable speichern

Wenn ich zu drucken:

print($html_data =~ m/<iframe id="pdfDocument" src=.(.*)pdf/g); 

Er druckt, was ich sparen wollen, aber wenn man versucht, es zu retten mit:

$link = $html_data =~ m/<iframe id="pdfDocument" src=.(.*)pdf/g; 

ich wieder eine ‚1‘ als den Wert von $link. Ich nehme an, das liegt daran, dass es "1" gefunden hat. Aber wie speichere ich stattdessen den Inhalt des Spiels?

+0

[The Pony er kommt ...] (http://stackoverflow.com/a/1732454/554546) –

Antwort

4

Die angepaßten Teilausdrücke eines Musters werden in Variablen gespeichert $1, $2 usw. Sie können auch das gesamte abgestimmte Muster erhalten kann ($&), aber dies ist teuer und sollte vermieden werden.

Die Unterscheidung im Verhalten hier ist übrigens das Ergebnis von Skalar vs Liste Kontext; Sie sollten sie kennen lernen, wie sie sich unterscheiden und wie sie das Verhalten verschiedener Perl-Ausdrücke beeinflussen.

+2

Verwenden 'nicht $ &' . Es verlangsamt jeden Regex, der keine Captures in Ihrem gesamten Programm verwendet. Nein, das hat sich in der neueren Version von Perl nicht geändert, also habe ich dieses Bit aus Ihrem Post gelöscht. Wenn Sie etwas haben möchten, das diesen Nachteil nicht hat, verwenden Sie/p und '$ {^ MATCH}'. Siehe [perlvar] (http: //perldoc.perl.org/perlvar.html) für die Dokumentation dieser Variablen. – ikegami

6

Beachten Sie die/g, um alle Übereinstimmungen zu erhalten. Diese können unmöglich in einen Skalar gesetzt werden. Sie benötigen ein Array.

my @links = $html_data =~ m/<iframe id="pdfDocument" src=.(.*)pdf/g; 

Wenn Sie nur das erste Spiel wollen:

my ($link) = $html_data =~ m/<iframe id="pdfDocument" src=.(.*)pdf/; 

Beachten Sie die Pars (und das Fehlen von nun nutzlos/g). Sie benötigen sie, um m // im Listenkontext aufzurufen.

+0

Das/g im skalaren Kontext ist in Ordnung, wenn Sie versuchen, das gleiche zu tun, was es tut. Sie brauchen es nicht, um die Liste der Aufnahmen zu erhalten. –

+0

@brian d foy, ich habe nicht gesagt */g im skalaren Kontext * ist nicht sinnvoll. Ich habe nicht einmal gesagt, dass es hier nicht nützlich ist. Ich sagte * Skalar Kontext * ist hier nicht sinnvoll. (Obwohl es immer noch im skalaren Kontext gemacht werden kann: 'my $ link = $ html_data = ~ m /.../? $ 1: undef;') – ikegami

0

Aus 'perlfunc' docs:

Druckliste
Drucke ein String oder eine Liste von Strings.

So print m//, wobei m // feststellt, dass der Rückgabewert
wollte (wantarray?) Ist eine Liste
(It Appers m // ohne Einfanggruppen Gibt 1 oder 0 Spiel Pass
oder fehlschlagen, wo wie m // g eine Liste von Übereinstimmungen zurückgibt).

und

$link = m // kann nur Skalar sein (im Gegensatz zur Liste) Kontext.
Also, m // gibt die Übereinstimmungsergebnisse 1 (wahr) oder 0 (falsch) zurück.

0

Ich habe gerade Code wie folgt geschrieben. Es kann helfen. Es ist im Grunde wie deine, außer meiner hat noch ein paar Klammern.

Also Ihr von diesem Beispiel kann so etwas sein, wenn Sie versuchen, die ganze Sache zu speichern? Ich bin mir nicht sicher, aber Sie können meine als ein Beispiel verwenden. Ich bin zu speichern, was in (\ w +) ist:

($link) = ($html_data =~ (m/<iframe id="pdfDocument" src=.(.*)pdf/g));