2011-02-08 3 views
8

Attualmente sto coprendo Perls RegExps e nel complesso lo capisco. Penso di aver fatto fuoriuscite di caratteri, cioè di testare una barra rovesciata, denotabile da m/\/in quanto è necessario procedere con il backslash comprare il carattere \ prima a dire a perl in questa istanza di cercarlo come apposto al suo solito significato .Perché il simbolo @ è scappato in questa espressione regolare di Perl?

Quello che non capisco con il codice qui sotto è, questo modello corrisponde e perché (\) viene utilizzato quando si verifica l'indirizzo di posta elettronica con @ symbold (nell'espressione if statement). Non sono consapevole @ è un personaggio speciale che ha bisogno di scappare o mi è sfuggito qualcosa?

#!/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

sembra '/ @ /' lo stesso significato di '/ \ @ /'. Ma attenzione: '/ @ x /' è molto diverso da '/ \ @ x /'. – aschepler

+0

Oh ok, ho ancora da leggere, ma lo terrò a mente. Mille grazie per l'aiuto !! Ho fatto del mio meglio per cercare di risolverlo, rileggendo, senza chiedere, per chiedere il sake o l'ozio ma stavo lottando. Grazie ancora –

+1

Heh, cosa fai se vuoi abbinare un riferimento a '@ x'? :) Assegnalo a uno scalare e smetti di cercare di essere così intelligente! – mkb

risposta

8

@ non è un carattere riservato rispetto alla regex, ma è per Perl (è il simbolo di matrice)

+1

Grazie. Molto apprezzato. –

11

E 'probabilmente sfuggito per evitare di essere interpretato come un sigillo array. Non è strettamente necessario, ma è un'abitudine difficile da rompere.

Esempi:

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

rendimenti:

yay 

stesso con:

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

Sì, avevo sentito o // o ## è stato usato ma non sapevo che @@ potesse essere anche. Brillante. Grazie, molto utile. –

+4

@Mike Thornley Puoi anche abbinare le parentesi come: 'm {...}' - Penso che questo sia coperto in perlop sotto "Quote e Quote-Like". Se no, allora in perlsyn. Il "problema" con @ è che i letterali delle espressioni regolari ricadono nella categoria "citazione interpolata" a meno che non siano nella forma "m" ... ", ecc. –

+0

@Mike Ahh: [I dettagli di Gory di Parsing Quoted Constructs] (http://perldoc.perl.org/perlop.html#Gory-details-of-parsing-quotated-constructs) di perlop lo copre un po ';-) –

5

In Perl, si può sfuggire qualsiasi potenziale metacarattere regex ed essere garantito è un letterale.

Inoltre, per @, è il sigillo dell'array, quindi se c'è qualche possibilità di essere scambiato per una variabile @/, vale la pena fuggire.

+0

Mille grazie per l'aiuto !. –

5

Gli array sono interpolate in entrambe le stringhe e regex doppi apici in Perl, con la variabile speciale $" (di default un carattere di spazio) che va tra ogni elemento:

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

Io uso raramente questa funzione, ma di tanto in tanto si è utile, ad esempio:

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