Оператор . в Perl

Оператор точка используется в Perl для конкатенации (соединения) строк.

Пример:

▶ Run
#!/usr/bin/perl

print 'ABC' . 'DEF';

Программа выведет на экран строку 'ABCDEF'.

В этом примере оператор точка применяется к двум строкам написанных в коде программы (такие строки называются "строковые литералы").

Обычно в качестве операндов оператора точка . являются строковые литералы, скалярные переменные или результаты работы других функций.

Строки и числа

Оператор . всегда работает со своими аргументами как со строками. Результат всех этих четырех операций будет один и тот же — строка '11'.

  • 1 . 1
  • 1 . '1'
  • '1' . 1
  • '1' . '1'

И это прекрасно. Можно совершенно без проблем конкатенировать числа к строкам — и результат будет ровно такой как ожидаешь.

Использования массива в качестве операнда

Вот пример программы в которой массив конкатенируется со строками с помощью оператора .:

▶ Run
#!/usr/bin/perl

my @arr = ('one', 'two', 'three');

print 'A' . @arr . 'B';

Программа выведет на экран строку 'A3B'.

'A' . @arr . 'B' это то же самое что 'A' . scalar(@arr) . 'B'.

При использовании массива с оператором точка . массив используется в скалярном контексте, а массив в скалярном контексте возвращает количество элементов в этом массиве.

Использования хеша в качестве операнда

Вот пример программы в которой хеш конкатенируется со строками с помощью оператора .:

▶ Run
#!/usr/bin/perl

my %h = (
    a => 'one',
    b => 'two',
);

print 'A' . %h . 'B';

В зависимости от версии Perl программа выведет на экран либо строку вида 'A2/8B', либо строку 'A2B'.

'A' . %h . 'B' это то же самое что 'A' . scalar(%h) . 'B'.

Точно так же как и в случае массива, при использовании хеша с оператором точка . хеш будет использован в скалярном контексте.

Начиная с версии Perl 5.26 хеш в скалярном контексте возвращает количество пар элементов в этом хеше. А в версии Perl до 5.26 хеш в скалярном контексте возвращает информацию про внутреннее устройство хеша.

Использование ссылки на сабу в качестве операнда

Вот пример программы в которой ссылка на сабу конкатенируется со строками с помощью оператора .:

▶ Run
#!/usr/bin/perl

my $sub = sub {
   return 42;
};

print 'A' . $sub . 'B';

Perl до версии 5.22 выведет на экран что-то вроде ACODE(0x1452f00)B, начиная с 5.22 на экране будет приблизительно такая же строчка, только там будет больше цифр после 0x: ACODE(0x561e87413ed8)B.

Разные запуски программы будут показывать разные числа.

'A' . $sub . 'B' это то же самое что и 'A' . scalar($sub) . 'B'. При использовании в скалярном контексте анонимная саба возвращает строку вида CODE(0x10dbf00) (информация о том где в памяти находится код этой сабы, знание об этом нужно весьма редко).

Символ подчеркивания _

Для конкатенации строк в Perl используется оператор точка .. Оператора нижнее подчеркивание _ в Perl нет. Но оператор _ есть в популярной Perl библиотеке Template::Toolkit и в этой библиотеке он используется для конкатенации.

utf8 флаг

В том случае если в конкатенации принимает участие хотя бы одна строка у которой есть внутренний флаг, означающей что содержимое находится в кодировке utf8, то у получившейся строки такой флаг тоже будет. Вот пример кода, который подтверждает такое поведение:

▶ Run
#!/usr/bin/perl

use utf8;

my $str_with_flag = 'раз-два-три';

my $str_without_flag = 'one-two-three';

print utf8::is_utf8($str_with_flag) . "\n"; # prints 1
print utf8::is_utf8($str_without_flag) . "\n"; # prints empty string

print utf8::is_utf8($str_with_flag . $str_without_flag) . "\n"; # prints 1
print utf8::is_utf8($str_without_flag . $str_with_flag) . "\n"; # prints 1

Связанные темы

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

Комментарии