Какая разница между одиночными и двойными кавычками в Perl?
В Perl, в чем разница между '
и "
?
Например, у меня есть две переменные, как показано ниже:
$var1 = '\(';
$var2 = "\(";
$res1 = ($matchStr =~ m/$var1/);
$res2 = ($matchStr =~ m/$var2/);
Оператор $res2
жалуется, что Unmatched ( before HERE mark in regex m
.
Ответы
Ответ 1
Двойные кавычки используют расширение переменной. Одиночные кавычки не
В строке с двойными кавычками вам нужно избежать определенных символов, чтобы они не интерпретировались по-разному. В одной кавычки вы не используете (за исключением обратного слэша, если это конечный символ в строке)
my $var1 = 'Hello';
my $var2 = "$var1";
my $var3 = '$var1';
print $var2;
print "\n";
print $var3;
print "\n";
Это приведет к выводу
Hello
$var1
Perl Monks имеет довольно хорошее объяснение этого здесь
Ответ 2
'не будет разрешать переменные и escape-последовательности
"разрешит переменные и escape-символы.
Если вы хотите сохранить свой символ\в строке в $var2, используйте "\\ ("
Ответ 3
Двойные кавычки интерпретируются, а одинарная кавычка не
Ответ 4
Perl принимает строки с одним кавычком как есть и интерполирует строки с двойными кавычками. Interpolate означает, что он заменяет переменные переменными значениями, а также понимает экранированные символы. Итак, ваш "\ (" интерпретируется как "(', а ваше регулярное выражение становится m/(/, поэтому Perl жалуется).
Ответ 5
Если вы собираетесь создавать строки регулярных выражений, вы действительно должны использовать qr//quote-like operator:
my $matchStr = "(";
my $var1 = qr/\(/;
my $res1 = ($matchStr =~ m/$var1/);
Он создает скомпилированное регулярное выражение, которое намного быстрее, чем просто использование переменной, содержащей строку. Он также вернет строку, если не используется в контексте регулярного выражения, поэтому вы можете сказать такие вещи, как
print "$var1\n"; #prints (?-xism:\()
Ответ 6
"" Поддерживает переменную интерполяцию и экранирование. поэтому внутри "\("
\
выполняется экранирование (
Где "не поддерживается". Итак, '\('
буквально \(