Подтвердить что ты не робот

Какая разница между одиночными и двойными кавычками в Perl?

В Perl, в чем разница между ' и "?

Например, у меня есть две переменные, как показано ниже:

$var1 = '\(';
$var2 = "\(";

$res1 = ($matchStr =~ m/$var1/);
$res2 = ($matchStr =~ m/$var2/);

Оператор $res2 жалуется, что Unmatched ( before HERE mark in regex m.

4b9b3361

Ответ 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

"" Поддерживает переменную интерполяцию и экранирование. поэтому внутри "\(" \ выполняется экранирование (

Где "не поддерживается". Итак, '\(' буквально \(