В чем разница между одинарными и двойными кавычками в Perl? - PullRequest
16 голосов
/ 03 июня 2009

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

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

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

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

В заявлении $res2 жалуется, что Unmatched ( before HERE mark in regex m.

Ответы [ 6 ]

34 голосов
/ 03 июня 2009

Двойные кавычки используют переменные расширения. Одиночные кавычки не

В строке в двойных кавычках вам нужно экранировать определенные символы, чтобы они не интерпретировались по-разному. В одиночной строке в кавычках вы этого не сделаете (за исключением обратной косой черты, если это последний символ в строке)

my $var1 = 'Hello';

my $var2 = "$var1";
my $var3 = '$var1';

print $var2;
print "\n";
print $var3;
print "\n";

Это выдаст

Hello
$var1

Монахи Perl довольно неплохо объясняют это здесь

4 голосов
/ 03 июня 2009

'не разрешает переменные и экранирует

"будет разрешать переменные и экранировать символы.

Если вы хотите сохранить ваш \ символ в строке в $ var2, используйте "\\ ("

3 голосов
/ 03 июня 2009

Двойные кавычки интерпретируются, а одинарные - не

2 голосов
/ 03 июня 2009

Если вы собираетесь создавать строки регулярных выражений, вам действительно следует использовать оператор qr // quote-like :

my $matchStr = "(";
my $var1 = qr/\(/;
my $res1 = ($matchStr =~ m/$var1/);

Он создает скомпилированное регулярное выражение, которое намного быстрее, чем просто использование переменной, содержащей строку. Он также вернет строку, если она не используется в контексте регулярного выражения, поэтому вы можете сказать что-то вроде

print "$var1\n"; #prints (?-xism:\()
2 голосов
/ 03 июня 2009

Perl принимает строки в одинарных кавычках «как есть» и интерполирует строки в двойных кавычках. Интерполировать означает, что он заменяет переменные значениями переменной, а также понимает экранированные символы. Итак, ваш "\ (" интерпретируется как '(', а ваше регулярное выражение становится m / (/, поэтому Perl жалуется.

1 голос
/ 03 июня 2009

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

Где as '' также не поддерживает. Так что '\(' буквально \(

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