2009-11-02 20 views
11

Jeśli mam operatora dopasowywania, w jaki sposób zapisać części ciągów przechwyconych w nawiasach w zmiennych zamiast używać $1, $2 itd.?Jak wyodrębnić dopasowania z operatora dopasowania Perla na zmienne?

... = m/stuff (.*) stuff/; 

Co dzieje się po lewej?

+0

Całkowicie zastąpiłem pytanie oparte na komentarzach Joachima na inne odpowiedzi. To nie jest pytanie typu "regex". –

+0

Tak brzmiącą frazę pytającą ma sens, jakbyś przyjął moją odpowiedź. – innaM

+0

@brian, twoja edycja jest prawdopodobnie bardziej zwięzła, ponieważ moje pytanie dotyczyło wyłącznie składni używanej z operatorem m // i wokół niego, a nie z samym regexp. Mój błąd. Ale chciałbym umieścić gdzieś tam słowo "wyodrębnij", bo to jest to, na co będę googlować, gdy zapomnę, jak to zrobić! – joachim

Odpowiedz

29

Sztuką jest, aby prace m // w kontekście listy za pomocą przypisania listy:

($interesting) = $string =~ m/(interesting)/g; 

Może to być starannie przedłużony złapać więcej rzeczy, np:

($interesting, $alsogood) = $string =~ m/(interesting) boring (alsogood)/g; 
+0

Prawda. Chociaż zawsze utknąłem w tym miejscu, to składnia, by uzyskać rzeczy w nazwanych zmiennych, a nie po stronie regexp, więc przejrzałem część regexp przykładu i odpowiedź. – joachim

+0

[Również] (https://perlmaven.com/how-to-extract-strings-from-a-file) '@interesting = $ string ...'? –

3

Zazwyczaj także chcesz wykonać test, aby upewnić się, że wejściowy ciąg pasuje do Twojego zwykłego wyrażenia. W ten sposób można również obsługiwać przypadki błędów.

Aby wydobyć coś interesującego, musisz również w jakiś sposób zakotwiczyć fragment, który chcesz wyodrębnić.

więc ze swoim przykładzie, najpierw upewnij się, że ciąg wejściowy pasuje do naszej ekspresji, a następnie wydobyć trochę między dwoma bitami „nudnych”:

$input = "boring interesting boring"; 
if($input =~ m/boring (.*) boring/) { 
    print "The interesting bit is $1\n"; 
} 
else { 
    print "Input not correctly formatted\n"; 
} 
8

użyć bracketing budowę (...) stworzyć bufor przechwytywania. Następnie użyj specjalnych zmiennych, aby uzyskać dostęp do przechwyconego łańcucha.

if (m/(interesting)/) { 
    my $captured = $1; 
} 
+0

** Nie potrzebujesz grupy przechwytującej **, jeśli chcesz uzyskać całe wyrażenie. ** Zamiast tego użyj '0 $'.** –

+5

@Peter: Myślę, że musicie pomylić $ 0, nazwę bieżącego programu z czymś innym. –

+0

... w rzeczywistości z czymś zupełnie innym. – innaM

0

$ & - ciąg pasujący do ostatniego udanego dopasowania wzorca (nie licząc jakiekolwiek mecze ukryte w bloku lub eval() otoczonej bieżącego bloku).

#! /usr/bin/perl 

use strict; 
use warnings; 

my $interesting; 
my $string = "boring interesting boring"; 
$interesting = $& if $string =~ /interesting/; 
+4

Nie używaj $ &. Szczególnie w tym przypadku, jeśli dopasowujesz dosłowny tekst, nie musisz w ogóle dopasowywać. Już znasz odpowiedź bez $ i. –

2

Można używać nazwanych bufory przechwytywania:

if (/ (?<key> .+?) \s* : \s* (?<value> .+) /x) { 
    $hash{$+{key}} = $+{value}; 
} 
1

@strings idzie na lewo i będzie zawierał wynik, a następnie przechodzi swój ciąg wejściowy $input_string. Nie zapomnij o oznaczeniu flagi g w celu dopasowania wszystkich podciągów.

my @strings=$input_string=~m/stuff (.*) stuff/g;