L'opérateur x en Perl

L'opérateur de x se comporte différemment en fonction de la manière dont il est utilisé.

Dans скалярном contexte, il est utilisé pour créer des lignes de la longueur souhaitée, de la des caractères récurrents. On peut dire que cet opérateur fait "la multiplication" pour les lignes.

Dans списочном le contexte (et si l'opérande de gauche est enregistré entre parenthèses ou l'utilisation de l'opérateur qw), il répète que l'élément le nombre de fois spécifié.

Voici un exemple de travail de l'opérateur x dans скалярном contexte:

▶ Run
#!/usr/bin/perl

my $str = 'A' x 4;

print $str;

Le programme affichera une ligne composée de quatre caractères 'A': 'AAAA'.

Si dans le opérande indiqué plusieurs caractères, ils seront répétés:

▶ Run
#!/usr/bin/perl

my $str = 'Abc' x 2;

print $str;

Cet exemple affiche la chaîne de 'AbcAbc'.

L'utilisation d'une chaîne vide

Dans скалярном le contexte de l'opérateur x répète la ligne qui correspond à la gauche de son opérande de fois que le nombre indiqué de son opérande de droite.

Si vous spécifiez comme opérande de gauche une chaîne vide '', dans скалярном contexte, le résultat sera toujours une chaîne vide, indépendamment de la la valeur de l'opérande de droite:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my $str = '' x 100;

print Dumper $str;

Par la conclusion du programme sera visible que dans $str contient une chaîne vide.

Il n'y a aucune raison d'utiliser cet opérateur dans скалярном contexte avec une chaîne vide.

La valeur de l'opérande de droite

Dans скалярном le contexte de l'opérande de droite de l'opérateur d' x dit combien de fois répéter la ligne, qui est contenue dans le opérande. Dans ce cas, si un opérande est un entier positif, il est évident que résultant.

Mais les chiffres ne sont pas positifs.

  • Dans le cas où l'opérande de droite est le nombre de 0, le résultat est toujours une chaîne vide.
  • Si l'opérande de droite est un nombre négatif, le résultat est toujours une chaîne vide.

Dans ce cas, si le code de use warnings;, alors l'utilisation d'un nombre négatif comme à droite l'opérateur affiche un message d'avertissement. Voici un exemple de script qui affiche la chaîne de 'Negative repeat count does nothing at script.pl line 5.'.

▶ Run
#!/usr/bin/perl

use warnings;

my $str = 'a' x -3;

print $str;

Si l'opérande de droite est un nombre avec décimales, c'est cette partie fractionnaire est tout simplement ignorée. Résultat 'A' x 2.1 sera exactement la même que 'A' x 2.99 — la chaîne de 'AA'.

Списочный contexte

Dans списочном le contexte de l'opérateur x répète l'élément. Mais, outre que le besoin списочный contexte, le besoin de encore et d'accueillir l'opérande de gauche entre parenthèses. Le code suivant crée un tableau @arr qui contient 3 éléments chaque élément est une chaîne de 'a':

▶ Run
#!/usr/bin/perl

use Data::Dumper;

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

print Dumper \@arr;

Mais si vous ne spécifiez pas les parenthèses dans le opérande, et d'écrire my @arr = 'a' x 3;, dans le tableau @arrsera un seul élément de la chaîne de 'aaa'.

En plus de simples parenthèses, vous pouvez utiliser l'opérateur qw:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

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

print Dumper \@arr;

Lorsque vous exécutez ce code dans le tableau @arr sera de 4 éléments, les lignes 'abc', 'def', 'abc', 'def'.

La documentation officielle

Voici un extrait de la sortie de la commande perldoc perlop pro de l'opérateur 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

Autres articles