为什么@符号在此Perl正则表达式中被转义?

时间:2011-02-08 19:23:06

标签: regex perl escaping

我目前正在报道Perls RegExps,总的来说我理解它。逃避字符我也认为,即测试一个反斜杠,可以用m / \ /表示反斜杠需要继续进行购买\字符首先告诉perl在这个实例中搜索它作为它的通常含义

我对下面的代码不明白,这种模式匹配以及使用@ symbold(在if语句表达式中)测试电子邮件地址时使用的原因(\)。我不知道@是一个需要逃避的特殊角色还是我错过了什么?。

#!/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 个答案:

答案 0 :(得分:11)

可能会逃脱以避免被解释为数组印记。这不是绝对必要的,但这是一个很难打破的习惯。

示例:

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

的产率:

yay

同样:

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

答案 1 :(得分:8)

@不是关于正则表达式的保留字符,但它适用于perl(它是数组符号)

答案 2 :(得分:5)

在Perl中,你可以逃避任何潜在的正则表达式元字符,并保证它是文字。

另外,对于@,它是数组符号,所以如果有可能将它误认为@/变量,则值得逃避。

答案 3 :(得分: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]*$/;
}