2011-02-08 6 views
8

現在、私はPerls RegExpsをカバーしており、全体的に私はそれを理解しています。文字をエスケープする私はまた、バックスラッシュを進める必要があるという点でバックスラッシュをテストすると考えています。この例ではperlに最初に\を付けて、それを通常の意味。このPerl正規表現で@記号がエスケープされているのはなぜですか?

私が持っている以下のコードでは分かりませんが、このパターンは一致しています。@記号の付いた電子メールアドレスをテストするときにはなぜ(\)が使われますか?私はエスケープを必要とする特殊文字は気付かないか、何かを逃したことがありますか?

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

「/ @ /」は '/ \ @ /'と同じ意味を持ちます。しかし注意してください: '/ @ x /'は '/ \ @ x /'とは非常に異なっています。 – aschepler

+0

ああ、私はさらに読むことがありますが、私はそれを覚えています。あなたの援助に感謝します!!私はそれを解決しようと努力するために努力しましたが、尋ねることなく、頼むことや怠惰を求めるために私は苦労していました。もう一度お返事します –

+1

Heh、 '@ x'への参照に一致させたい場合はどうしますか? :)それをスカラーに割り当てて、それほど巧妙であることをやめよう! – mkb

答えて

8

@は、正規表現に関しては予約文字ではありませんが、それは(それが配列のシンボルです)

+1

ありがとうございます。とても有難い。 –

11

おそらく、配列の印章として解釈されるのを避けるためにエスケープしていますperlのためのものです。それは厳密には必要ではありませんが、それを破るのは難しい習慣です。

例:

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

利回り:と同じ

yay 

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

ええ、//または##のいずれかが使われていると聞きましたが、@@も知りませんでした。ブリリアント。ありがとう、非常に役立つ。 –

+4

@Mike Thornley 'm {...} 'のような中括弧にもマッチすることができます - これはperlopで"引用と引用符で囲まれた "の部分でカバーされていると思います。そこになければ、perlsynで。 @の "issue"は、正規表現リテラルが 'm '...''などの形式でない限り、 "interpolated quote"カテゴリに該当します。 –

+0

@Mike Ahh:[引用した構文の構文解析の詳細] perlopの(http://perldoc.perl.org/perlop.html#Gory-details-of-parsing-quoted-constructs)はそれを少しカバーしています;-) –

5

、あなたは、任意の潜在的な正規表現のメタ文字をエスケープすることができ、それはリテラルです保証され。

また、@の場合、それは配列sigilなので、@/という変数と間違えてしまう可能性がある場合は、エスケープする価値があります。

+0

助けてくれてありがとう! –

5

配列は、各要素間で起こって(デフォルトは空白文字)特殊変数$"で、Perlで両方の二重引用符で囲まれた文字列と正規表現に補間されています。私はめったにこの機能を使用しない

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

、時折

sub line_matches_words { 
    my ($line, @words) = @_; 
    local $" = '[ \t]+'; 
    return $line =~ /^[ \t]*@words[ \t]*$/; 
} 
関連する問題