2011-02-08 25 views
8

Obecnie obejmuję Perls RegExps i ogólnie rozumiem to myślę. Uciekając postaciom, które również uchwyciłem, tj. Testując odwrotny ukośnik, oznaczony przez m/\/tym, że należy ukrócić odwrotny ukośnik, należy kupić \ znak pierwszy, aby powiedzieć perlowi w tym przypadku, aby wyszukać go w formie odpowiadającej jego zwykłemu znaczeniu. .Dlaczego symbol @ jest unikany w tym wyrażeniu regularnym Perla?

To, czego nie rozumiem poniższym kodem, to taki wzór dopasowania i dlaczego (\) jest używany podczas testowania adresu e-mail za pomocą @ symbold (w wyrażeniu if). Nie jestem świadomy @ jest specjalną postacią, która potrzebuje ucieczki, czy coś przeoczyłem?

#!/usr/bin/perl 

EMAIL: 
{ 
print("Please enter your email address: "); 
$email = <STDIN>; 
    if ($email !~ /\@/) 
    { 
    print("Invalid email address.\n"); 
    redo EMAIL; 
    } 
    else 
    { 
    print("That could be a valid email address."); 
    } 
} 
+4

Pojawia się '/ @ /' oznacza to samo co '/ \ @ /'. Ale uważaj: '/ @ x /' bardzo różni się od '/ \ @ x /'. – aschepler

+0

No dobra, mam do przeczytania więcej, ale będę o tym pamiętać. Wielkie dzięki za twoją pomoc!!. Zrobiłem, co mogłem, aby spróbować rozwiązać ten problem, odczytywać bez pytania, pytać o sake lub bezczynność, ale walczyłem. Jeszcze raz dziękuję –

+1

Heh, co robisz, jeśli chcesz dopasować odniesienie do '@ x'? :) Przydziel to skalarowi i przestań być tak sprytny! – mkb

Odpowiedz

8

@ nie jest zastrzeżony znak względem regexes, ale to jest dla Perl (to symbol tablica)

+1

Dzięki. Bardzo doceniane. –

11

To prawdopodobnie uciekł, aby uniknąć interpretowane jako Sigil tablicy. Nie jest to bezwzględnie konieczne, ale złamanie jest trudnym nawykiem.

Przykłady:

$e = "\@foo"; 
if ($e =~ /@/) { 
    print "yay\n"; 
} 

Wynik:

yay 

samo z:

$e = "foo"; 
if ($e =~ [email protected]@) { 
    print "yay\n"; 
} 
+0

Tak, słyszałem albo // albo ##, ale nie wiedziałam, że @@ może być również. Znakomity. Dzięki, bardzo pomocne. –

+4

@Mike Thornley Możesz nawet dopasować nawiasy klamrowe, takie jak: 'm {...}' - Myślę, że jest to opisane w temacie "Cytuj i cytuj jak". Jeśli nie, to w perlsyn. "Problem" z @ jest literałem wyrażenia regularnego zaliczanego do kategorii "interpolowany cytat", chyba że w "m" ... ", itp. Formie. –

+0

@Mike Ahh: [The Gory Details Of Parsing Quoted Constructs] (http://perldoc.perl.org/perlop.html#Gory-details-of-parsing-quoted-constructs) od perlop obejmuje go nieco ;-) –

5

W Perl, można uniknąć potencjalnego regex metaznaku i być zagwarantowana jest to dosłowne.

Również dla @ jest to sygnatura tablicowa, więc jeśli istnieje jakakolwiek szansa, że ​​zostanie pomylona ze zmienną @/, warto ją wydostać.

+0

Wielkie dzięki za pomoc !. –

5

Tablice są interpolowane do obu podwójnych cudzysłowów i regexes w Perl, ze szczególnym zmiennej $" (domyślnie spacja) dzieje pomiędzy poszczególnymi elementami:

my @array = ('a', 'b', 'c'); 
print "@array"; # prints "a b c" 
print "a b c" =~ /@array/; # prints "1" 

rzadko korzystać z tej funkcji, ale od czasu do czasu przydaje się, na przykład:

sub line_matches_words { 
    my ($line, @words) = @_; 
    local $" = '[ \t]+'; 
    return $line =~ /^[ \t]*@words[ \t]*$/; 
} 
Powiązane problemy