Operator x w Perl

Operator x zachowuje się różnie w zależności od tego jak jest on używany.

W скалярном kontekście jest on używany, aby utworzyć wiersze odpowiedniej długości z powtarzających się znaków. Można powiedzieć, że ten operator robi "mnożenie" dla wierszy.

W liście kontekstowej kontekście (i jeśli lewy operand jest zapisany w nawiasach lub z pomocą operatora qw) powtarza element określoną liczbę razy.

Oto przykład działania operatora x w скалярном kontekście:

▶ Run
#!/usr/bin/perl

my $str = 'A' x 4;

print $str;

Program wyświetli ciąg znaków składający się z czterech znaków 'A': 'AAAA'.

Jeśli w lewym opcja zdefiniowania kilku znaków, to wszystkie one zostaną powtórzone:

▶ Run
#!/usr/bin/perl

my $str = 'Abc' x 2;

print $str;

Ten przykład wyświetli ciąg 'AbcAbc'.

Korzystanie z pustego wiersza

W скалярном kontekście operator x powtarza wiersz, która znajduje się w lewym argumencie liczbę razy, która jest wyświetlana w prawym argumencie.

Jeśli określić jako lewego operandu jest pusty ciąg '', to w скалярном kontekście wynik zawsze będzie pusty ciąg znaków, niezależnie od wartości prawego operandu:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my $str = '' x 100;

print Dumper $str;

We wniosku programu będzie widać że w $str zawiera pusty ciąg znaków.

Nie ma sensu używać ten operator w скалярном kontekście z pustym ciągiem znaków.

Wartość prawego argumentu

W скалярном kontekście prawy operand instrukcji x mówi ile razy trzeba powtórzyć wiersz, który znajduje się w lewym argumencie. W przypadku, gdy argument dodatnią liczbą całkowitą, to jest oczywiste, że uda się w wyniku.

Ale liczby są nie tylko pozytywne.

  • W przypadku, gdy prawy operand jest liczbą 0, to wynik jest zawsze pusty ciąg znaków.
  • Jeśli operand po prawej stronie — jest to liczba ujemna, to wynik też jest zawsze pusty ciąg znaków.

W tym przypadku, jeśli w kodzie jest use warnings;, korzystanie z liczby ujemnej jako prawego operator wyświetli na ekranie ostrzeżenie. Oto przykładowy skrypt, który wypisze na ekran ciąg 'Negative repeat count does nothing at script.pl line 5.'.

▶ Run
#!/usr/bin/perl

use warnings;

my $str = 'a' x -3;

print $str;

Jeśli operand po prawej stronie — jest to liczba dodatnia z ułamek, to ta część ułamkowa po prostu wyrzucić. Wynik 'A' x 2.1 będzie dokładnie taki sam, jak wynik 'A' x 2.99 — wiersz 'AA'.

Списочный kontekst

W liście kontekstowej kontekście operator x powtarza element. Ale poza tym, że potrzebny списочный kontekst, trzeba jeszcze i umieścić lewy operand jest w nawiasach. Poniższy kod tworzy tablicę @arr w którym zawiera 3 elementy, każdy element to ciąg 'a':

▶ Run
#!/usr/bin/perl

use Data::Dumper;

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

print Dumper \@arr;

Ale jeśli nie określić nawiasy w lewym argumencie, a napisz my @arr = 'a' x 3;, to w tablicy @arrbędzie tylko jeden element, wiersz 'aaa'.

Oprócz prostych można użyć nawiasów operator qw:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

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

print Dumper \@arr;

Podczas wykonywania tego kodu w tablicy @arr będzie 4 elementy, wiersze 'abc', 'def', 'abc', 'def'.

Oficjalna dokumentacja

Oto fragment danych wyjściowych polecenia perldoc perlop o operator 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

Inne artykuły