2009-06-24 18 views
49

Cosa significa $ 1 in Perl? Inoltre, cosa significa $ 2? Quante variabili del numero $ ci sono?

+1

E se ci fosse alcuna corrispondenza? – ojblass

+3

Si potrebbe fare bene a controllare qualcosa come _Learning Perl_ o altre introduzioni a Perl che spiega le basi della lingua. –

+0

Ora Brian, perché consiglieresti quel libro? I Monks sono una carità dopotutto ... –

risposta

55

Le $number variabili contengono le parti della stringa che ha trovato il capture groups(...) nel modello per la vostra ultima partita regex se la partita ha avuto successo.

Per esempio, prendete la seguente stringa:

$text = "the quick brown fox jumps over the lazy dog."; 

Dopo la dichiarazione

$text =~ m/ (b.+?) /; 

$1 uguale il testo "brown".

+3

Cattura, non raggruppamenti. –

+1

e se ci saranno più di una partita? possiamo ottenere in qualche modo tutte le partite? – user1289

31

Le variabili numero sono le partite dell'ultimo successo partita o la sostituzione dell'operatore si è applicato:

my $string = 'abcdefghi'; 

if($string =~ /(abc)def(ghi)/) { 
    print "I found $1 and $2\n"; 
    } 

Verificare sempre che la partita o la sostituzione era successo prima di utilizzare $ 1 e così via. Altrimenti, potresti raccogliere gli avanzi da un'altra operazione.

Le espressioni regolari di Perl sono documentate in perlre.

+0

Se ci sono sempre $ 1 e $ 9, qual è il valore se ci fossero meno di nove partite? –

+3

$ 1 a $ 9 non sono sempre lì. Penso che Jim abbia letto male la pagina man. Sto citando la sezione pertinente: "Puoi avere tutte le parentesi che vuoi.Se hai più di 9 sottostringhe, le variabili $ 10, $ 11, ... si riferiscono alla sottostringa corrispondente. All'interno del pattern, \ 10, \ 11 , ecc., fai riferimento alle sottostringhe se ci sono state almeno tante parentesi a sinistra prima del backreference. Altrimenti (per compatibilità con le versioni precedenti) \ 10 è uguale a \ 010, un backspace e \ 11 uguale a \ 011, una scheda E così via. (\ 1 a \ 9 sono sempre backreferences.) " –

+2

-1 per troppe mezze verità. Sono il risultato di catture, non la partita nel suo complesso. Sono impostati solo su partite riuscite, il che significa che è necessario verificare se la partita ha avuto successo prima di usarle.Come Alan ha già sottolineato, hai confuso il comportamento caso speciale della notazione backslash alternativa. –

6

Questi sono chiamati "variabili di corrispondenza". Come accennato in precedenza contengono il testo della tua ultima corrispondenza di espressioni regolari.

Maggiori informazioni qui: http://cslibrary.stanford.edu/108/EssentialPerl.html

(CTRL-F per il 'match variabili' per trovare la sezione corrispondente)

0

Le variabili $ 1 .. $ 9 sono anche leggere solo le variabili così non si può implicitamente assegnare un valore per loro:

$1 = 'foo'; print $1;

che restituirà un errore: Modifica di un valore di sola lettura tentato in linea di script 1.

Non è inoltre possibile utilizzare i numeri per l'inizio dei nomi di variabili:

$1foo = 'foo'; print $1foo;

Anche in questo caso viene visualizzato un errore.

7

Come altri hanno sottolineato, $ x sono variabili di cattura per le espressioni regolari che consentono di fare riferimento a sezioni di un modello abbinato.

Perl supporta anche acquisizioni denominate che potrebbero essere più facili da ricordare per l'uomo in alcuni casi.

dato ingresso: 111 222

/(\d+)\s+(\d+)/ 

$ 1 è 111

$ 2 è 222

Si potrebbe anche dire:

/(?<myvara>\d+)\s+(?<myvarb>\d+)/ 

$ + {myvara} è 111

$ + {myvarb} è 222

11

$ 1, $ 2, ecc conterrà il valore delle catture dall'ultimo successo partita - è importante verificare se la partita è riuscita prima di loro l'accesso, vale a dire

if ($var =~ m/()/) { # use $1 etc... } 

un esempio del problema - $ 1 contiene 'rapida' in entrambe le istruzioni di stampa di seguito:

#!/usr/bin/perl 

'Quick brown fox' =~ m{ (quick) }ix; 
print "Found: $1\n"; 

'Lazy dog' =~ m{ (quick) }ix; 
print "Found: $1\n"; 
0

ho il sospetto che non ci può essere fino a 2**32 -1 variabili partita numerati, su una a 32 bit compilato Perl binario.

2

In questioni di carattere generale per quanto riguarda le variabili "magici" in Perl si può rispondere, cercando in Perl documentazione di variabili predefinite a la:

perldoc perlvar 

Tuttavia, quando si cerca questa documentazione per $ 1, ecc Troverete riferimenti in un numero di posti tranne la sezione su queste variabili "cifre". Bisogna cercare

$<digits> 

avrei aggiunto che questo Brian's answer sia commentando o la modifica, ma non hanno abbastanza rep. Se qualcuno aggiunge questo, rimuoverò questa risposta.

1

Dal momento che lei ha chiesto ai gruppi di cattura, si potrebbe desiderare di sapere circa $ + troppo .. molto utile ..

use Data::Dumper; 
$text="hiabc ihabc ads byexx eybxx"; 
while($text=~/(hi|ih)abc|(bye|eyb)xx/igs) 
{ 
    print Dumper $+; 
} 

OUTPUT:
$VAR1 = 'hi';
$VAR1 = 'ih';
$VAR1 = 'bye';
$VAR1 = 'eyb';