Почему символ @ экранирован в этом регулярном выражении Perl? - PullRequest
8 голосов
/ 08 февраля 2011

Я в настоящее время покрываю 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 ]

11 голосов
/ 08 февраля 2011

Вероятно, он избежал интерпретации как символ массива. Это не является строго необходимым, но это сложная привычка, чтобы сломать.

Примеры:

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

Выходы:

yay

То же самое с:

$e = "foo";
if ($e =~ m@foo@) {
  print "yay\n";
}
8 голосов
/ 08 февраля 2011

@ не является зарезервированным символом относительно регулярных выражений, но это для perl (это символ массива)

5 голосов
/ 08 февраля 2011

Массивы интерполируются как в строки в двойных кавычках, так и в регулярные выражения в 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]*$/;
}
5 голосов
/ 08 февраля 2011

В Perl вы можете избежать любого потенциального метасимвола регулярного выражения и быть уверенным, что это литерал.

Кроме того, для @ это символ массива, так что если есть вероятность того, что он будет принят за переменную @/, его стоит избегать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...