Оператор x в Perl

Оператор x ведет себя по разному в зависимости от того как он используется.

В скалярном контексте он используется для того чтобы создать строки нужной длины из повторяющихся символов. Можно сказать что этот оператор делает "умножение" для строк.

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

Вот пример работы оператора x в скалярном контексте:

▶ Run
#!/usr/bin/perl

my $str = 'A' x 4;

print $str;

Программа выведет на экран строку состоящую из четырех символов 'A': 'AAAA'.

Если в левом операнде указано несколько символов, то все они будут повторены:

▶ Run
#!/usr/bin/perl

my $str = 'Abc' x 2;

print $str;

Этот пример выведет на экран строку 'AbcAbc'.

Использование пустой строки

В скалярном контексте оператор x повторяет строку, которая указана в левом операнде количество раз, которое указано в правом операнде.

Если указать в качестве левого операнда пустую строку '', то в скалярном контексте результат всегда будет пустая строка, вне зависимости от значения правого операнда:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my $str = '' x 100;

print Dumper $str;

По выводу программы будет видно что в $str содержится пустая строка.

Нет никакого смысла использовать этот оператор в скалярном контексте с пустой строкой.

Значения правого операнда

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

Но числа бывают не только положительные.

  • В случае если правый операнд — это число 0, то результат — это всегда пустая строка.
  • Если правый операнд — это отрицательное число, то результат тоже всегда пустая строка.

В том случае если в коде есть use warnings;, то использование отрицательного числа в качестве правого оператора выдаст на экран предупреждение. Вот пример скрипта, который выведет на экран строку 'Negative repeat count does nothing at script.pl line 5.'.

▶ Run
#!/usr/bin/perl

use warnings;

my $str = 'a' x -3;

print $str;

Если правый операнд — это положительное число с дробной частью, это эта дробная часть просто отбрасывается. Результат 'A' x 2.1 будет точно такой же как результат 'A' x 2.99 — строка 'AA'.

Списочный контекст

В списочном контексте оператор x повторяет элемент. Но кроме того что нужен списочный контекст, нужно еще и разместить левый операнд в скобках. Код ниже создаст массив @arr в котором содержится 3 элемента, каждый элемент это строка 'a':

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my @arr = ('a') x 3;

print Dumper \@arr;

Но если не указать скобки в левом операнде, а написать my @arr = 'a' x 3;, то в массиве @arr будет только один элемент, строка 'aaa'.

Кроме простых скобок можно использовать оператор qw:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my @arr = qw(abc def) x 2;

print Dumper \@arr;

При выполнении этого кода в массиве @arr будет 4 элемента, строки 'abc', 'def', 'abc', 'def'.

Официальная документация

Вот фрагмент вывода команды perldoc perlop про оператор x:

Multiplicative Operators

...

    Binary "x" is the repetition operator. In scalar context or if the left
    operand is not enclosed in parentheses, it returns a string consisting of
    the left operand repeated the number of times specified by the right
    operand. In list context, if the left operand is enclosed in parentheses
    or is a list formed by "qw/STRING/", it repeats the list. If the right
    operand is zero or negative (raising a warning on negative), it returns an
    empty string or an empty list, depending on the context.

        print '-' x 80;             # print row of dashes

        print "\t" x ($tab/8), ' ' x ($tab%8);      # tab over

        @ones = (1) x 80;           # a list of 80 1's
        @ones = (5) x @ones;        # set all elements to 5

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

Комментарии