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

В языке программирования Perl для того чтобы создать строку в коде программы можно использовать одинарные ' или двойные кавычки ".

Между ними есть разница. В одинарных кавычках работают только эскейп последовательности \\ и \', в двойных кавычках кроме этих двух работают еще и другие эскейп последовательности. И только при использовании двойных кавычек имена переменных разворачиваются в значения (происходит интерполяция). Далее подробности.

Общее

И одинарные и двойные кавычки в языке программирования Perl используются для того чтобы описать строки в коде программы (строки в тексте программы называются "строковые литералы"). Вот пример:

▶ Run
#!/usr/bin/perl

my $str1 = 'Hello, world!';
my $str2 = "Hello, world!";

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

Обратный слеш

Еще одна общая вещь в использовании одинарных и двойных кавычек — это то как нужно действовать если нужно чтобы в строке был символ обратный слеш \. Если нужно создать строку с этим символом, то в строковом литерале нужно написать два обратных слеша \\. В получившейся строке будет один обратный слеш. Вот пример:

▶ Run
#!/usr/bin/perl

my $str1 = '\\';
my $str2 = "\\";

print $str1, "\n";
print $str2, "\n";

Эта программа выведет на экран:

\
\

Кавычки в строке

Первая разница между одинарными и двойными кавычками заключается в том что нужно сделать чтобы создать строку в которых есть одинарные или двойные кавычки.

С помощью одинарных кавычек очень легко создать строку в которой есть двойная кавычка: '"'. А если нужно сделать строку в которых есть одинарная кавычка, то ее нужно записать с помощью двух символов: обратный слеш \ и кавычка. '\'' — вот такой строковый литерал создаст строку из одного символа "одинарная кавычка".

В случае двойных кавычек — все наоборот. Удобно создать строку с одинарной кавычкой "'", а для того чтобы разместить в строке двойную кавычку нужно написать перед ней обратный слеш (это еще называют "экранировать") "\"".

Использование специальных символов

При использовании одинарных кавычек есть только две совокупности символов, которые превращаются в один символ. Это, как мы уже видели раньше, два обратных слеша \\ — они превращаются в один слеш; и обратный слеш и одинарная кавычка \' — это превращается в один символ "одинарная кавычка".

А вот при использовании двойных кавычек есть еще несколько таких совокупности символов (обычно их называют "эскейп последовательности"). Самая известная и часто используемая — это комбинация символов \n. \n в двойных кавычках превращается в один специальный символ "перевод строки". При использовании одинарных кавычек print 'ASDF\nQWERTY'; выведет на экран ASDF\nQWERTY, а при использовании двойных кавычек print "ASDF\nQWERTY"; на экране появится две строки:

ASDF
QWERTY

Другая используемая эскейп последовательность — это \t, при использовании в двойных кавычках это превращается в символ табуляции. Не очень часто, но еще используется \b, этот специальный символ стирает предыдущий символ (можно использовать для создания очень простых анимаций в консоли). Есть еще некоторое количество эскейп последовательностей, но они мало используются.

Интерполяция переменных

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

Эта фича языка очень часто используется.

▶ Run
#!/usr/bin/perl

my $var = 'John';

my $str1 = 'Hello, $var';
my $str2 = "Hello, $var";

print $str1, "\n";
print $str2, "\n";

Эта программа выведет на экран:

Hello, $var
Hello, John

Строку $str1 мы создали с помощью одинарных кавычек — и в строке содержится ровно то что было написано в строковом литерале — 'Hello, $var'. А в строке $str2 имя переменной $var заменилось на значение этой переменной.

Обратите внимание, что разворачиваются только скаляры и массивы:

▶ Run
#!/usr/bin/perl

my $var = 'John';
my @arr = ('one', 'two');
my %h = (
    a => 1,
);

sub my_sub {
    return 12;
}

print "$var @arr %h &my_sub";

Эта программа выведет на экран текст John one two %h &my_sub. Скаляр $var и массив @arr развернулись в значения, а хеш %h и саба my_sub — нет.

Рекомендация

Во многих случаях для того чтобы создать строковые литералы все равно что использовать — и одинарные и двойные кавычки будут работать одинаково. Рекомендация такая — если для строкового литера все равно что использовать — то используйте одинарные кавычки.

Другие статьи

Комментарии