2009-06-24 14 views
49

Co oznacza 1 dolar w Perlu? Co to jest $ 2? Ile jest zmiennych liczbowych $?Co oznacza 1 USD w Perlu?

+1

Co zrobić, jeśli nie było mecz? – ojblass

+3

Możesz zrobić dobrze, aby sprawdzić coś takiego jak _Learning Perl_ lub inne wprowadzenie do Perla, które wyjaśnia podstawy języka. –

+0

Teraz Brian, dlaczego miałbyś polecać tę książkę? Mnisi w końcu są organizacją charytatywną ... –

Odpowiedz

55

W $number zmienne zawierają części łańcucha, który pasował do capture groups(...) w strukturze do ostatniego meczu regex jeśli mecz był udany.

Na przykład, weźmy następujący ciąg:

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

Po oświadczeniu

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

$1 równa tekst "brown".

+3

Przechwytuje, nie grupuje. –

+1

co, jeśli będzie więcej niż jeden mecz? czy możemy jakoś uzyskać wszystkie mecze? – user1289

31

zmienne numeryczne są wyniki z ostatniego udany meczu lub zastępczego operatora został zastosowany:

my $string = 'abcdefghi'; 

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

zawsze sprawdzić, czy pasuje lub podstawienie powiodła przed użyciem 1 $ i tak dalej. W przeciwnym razie możesz odebrać resztki z innej operacji.

Wyrażenia regularne Perla są dokumentowane w perlre.

+0

Jeśli od 1 do 9 USD zawsze tam są, jaka jest wartość, jeśli było mniej niż dziewięć meczów? –

+3

Od 1 do 9 USD nie zawsze są dostępne. Myślę, że Jim źle przeczytał stronę man. Przytaczam odpowiednią sekcję: "Możesz mieć tyle nawiasów ile chcesz.Jeśli masz więcej niż 9 podciągów, zmienne 10 $, 11 $, ... odnoszą się do odpowiedniego podłańcucha. Wewnątrz wzorca \ 10, \ 11 itp. odwołaj się do ciągów znaków, jeśli przed odwołaniem zwrotnym było przynajmniej tyle lewych nawiasów, w przeciwnym razie (dla zgodności wstecznej) \ 10 jest takie samo jak \ 010, backspace i \ 11 jest takie samo jak \ 011, karta I tak dalej. (\ 1 do \ 9 są zawsze backreferencje.) " –

+2

-1 za zbyt wiele półprawd. Są wynikiem chwytania, a nie meczu jako całości. Są one ustawione tylko na udane mecze, co oznacza, że ​​musisz sprawdzić, czy mecz się powiódł, zanim je wykorzystasz.Jak już zauważył Alan, pomyliłeś zachowanie wyjątkowego przypadku alternatywnego zapisu odwróconego ukośnika. –

6

Są to tak zwane "Zmienne meczowe". Jak wcześniej wspomniano, zawierają tekst z ostatniego dopasowania do wyrażenia regularnego.

Więcej informacji tutaj: http://cslibrary.stanford.edu/108/EssentialPerl.html

(CTRL-F dla „Zmienne pasują do siebie”, aby znaleźć odpowiedni rozdział)

0

zmienne $ 1 .. $ 9 są również czytać tylko zmienne, więc nie można niejawnie przypisać stosunek do nich:

$1 = 'foo'; print $1;

to zwróci błąd: Modyfikacja wartości tylko do odczytu próby na linii skryptu 1.

Nie można również używać liczb na początku nazw zmiennych:

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

Powyższe spowoduje również błąd.

7

Jak zauważyli inni, $ x to zmienne przechwytywania dla wyrażeń regularnych, pozwalające na odniesienie do sekcji dopasowanego wzorca.

Perl obsługuje również przechwycone nazwy, które w niektórych przypadkach mogą być łatwiejsze do zapamiętania przez ludzi.

dane wejściowe: 111 222

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

$ 1 to 111

$ 2 wynosi 222

Można by również powiedzieć:

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

$ + {myvara} wynosi 111

$ + {myvarb} jest 222

11

$ 1, $ 2 itd będzie zawierać wartość przechwyconych od ostatniego udany meczu - ważne jest, aby sprawdzić, czy mecz udało przed uzyskaniem dostępu do nich, tj

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

przykładem problemu - $ 1 zawiera „Szybki” w obu sprawozdaniach drukowania poniżej:

#!/usr/bin/perl 

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

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

Podejrzewam, że nie może być aż 2**32 -1 numerowane zmienne mecz, na 32bit skompilowany Perl binarny.

2

W ogólne pytania dotyczące „magicznych” zmiennych w Perlu można odpowiedzieć patrząc w Perl dokumentacji zmiennych predefiniowanych a la:

perldoc perlvar 

Jednak podczas wyszukiwania tę dokumentację do 1 $ itd. Musisz znaleźć odniesienia w wielu miejscach, z wyjątkiem sekcji dotyczących tych "cyfrowych" zmiennych. Trzeba szukać

$<digits> 

bym dodał do tego Brian's answer albo komentowania lub edycji, ale nie mam wystarczająco dużo rep. Jeśli ktoś to doda, usunę tę odpowiedź.

1

Ponieważ poprosiłeś grupy przechwytywania, warto wiedzieć o $ + zbyt .. Dość przydatna ..

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';