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

Mik*_*ley 9 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.");
  }
}
Run Code Online (Sandbox Code Playgroud)

mkb*_*mkb 12

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

例子:

$e = "\@foo";
if ($e =~ /@/) {
  print "yay\n";
}
Run Code Online (Sandbox Code Playgroud)

收益率:

yay
Run Code Online (Sandbox Code Playgroud)

与:相同:

$e = "foo";
if ($e =~ m@foo@) {
  print "yay\n";
}
Run Code Online (Sandbox Code Playgroud)

  • @Mike Thornley你甚至可以匹配括号,例如:`m {...}` - 我认为这是在"引用和引用 - 喜欢"下的perlop中.如果没有,那么在perlsyn.@的"问题"是正则表达式文字属于"插值引用"类别,除非在`m'...'`等形式. (4认同)
  • @Mike Thomley:你可以使用字面上的任何角色作为你的界限.大括号/括号需要匹配(而不是重复),字母/数字需要在它们和引用运算符之间有空格(也可能是字符串).就个人而言,我建议坚持/或!或#或某种支架. (2认同)

Mat*_*ing 8

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


Pla*_*ure 5

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

而且,因为@它是数组sigil,所以如果它有可能被误认为@/变量,那么值得逃避.


Sea*_*ean 5

数组被插入到Perl中的双引号字符串和正则表达式中,$"每个元素之间都有特殊变量(默认为空格字符):

my @array = ('a', 'b', 'c');
print "@array";  # prints "a b c"
print "a b c" =~ /@array/;  # prints "1"
Run Code Online (Sandbox Code Playgroud)

我很少使用此功能,但偶尔会派上用场,例如:

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