L'operatore x in Perl

L'operatore x si comporta in modo diverso a seconda di come viene utilizzato.

In скалярном contesto viene utilizzato per creare una stringa di lunghezza di personaggi ricorrenti. Si può dire che questo operatore fa la "moltiplicazione" per le righe.

Nell'contesto (e se l'operando di sinistra è scritto tra parentesi o con utilizzando l'operatore qw) si ripete l'elemento il numero di volte specificato.

Ecco un esempio di lavoro operatore x in скалярном contesto:

▶ Run
#!/usr/bin/perl

my $str = 'A' x 4;

print $str;

Il programma visualizza una riga composta da quattro caratteri 'A': 'AAAA'.

Se a sinistra operando indicato alcuni caratteri, saranno ripetuti:

▶ Run
#!/usr/bin/perl

my $str = 'Abc' x 2;

print $str;

Questo esempio visualizza una riga 'AbcAbc'.

L'uso di una stringa vuota

In скалярном contesto l'operatore x ripete la stringa specificata in alto operando numero di volte specificato nell'operando a destra.

Se si specifica come l'operando di sinistra di una stringa vuota '', in скалярном contesto il risultato sarà sempre una stringa vuota, indipendentemente dal il valore dell'operando di destra:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my $str = '' x 100;

print Dumper $str;

A conclusione del programma sarà visto in $str contiene una stringa vuota.

Non ha senso usare questo operatore in скалярном contesto con una stringa vuota.

Il valore dell'operando di destra

In скалярном contesto l'operando di un'istruzione x dice quante volte è necessario ripetere la riga che contiene a sinistra operando. In tal caso, se l'operando un numero intero positivo, allora è ovvio che sarà il risultato.

Ma i numeri non sono solo positivi.

  • Nel caso in cui l'operando di destra è il numero di 0, il risultato è sempre una stringa vuota.
  • Se l'operando è un numero negativo, il risultato è anche sempre una stringa vuota.

In quel caso se nel codice ci sono use warnings;, quindi l'uso di un numero negativo come destro operatore visualizzerà un messaggio di avviso. Ecco un esempio di script che visualizza una riga 'Negative repeat count does nothing at script.pl line 5.'.

▶ Run
#!/usr/bin/perl

use warnings;

my $str = 'a' x -3;

print $str;

Se l'operando è un numero positivo con una parte decimale, è questa la parte frazionaria viene semplicemente scartato. Il risultato 'A' x 2.1 sarà esattamente lo stesso come 'A' x 2.99 — riga 'AA'.

Lista contesto

Nell'contesto l'operatore x ripete elemento. Ma oltre a questo che serve una lista contesto, è necessario ancora e inserire l'operando di sinistra tra parentesi. Il codice seguente crea un array di @arr che contiene 3 elementi, ogni elemento è una stringa 'a':

▶ Run
#!/usr/bin/perl

use Data::Dumper;

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

print Dumper \@arr;

Ma se non si specifica tra parentesi a sinistra operando, e scrivere my @arr = 'a' x 3;, poi nella matrice @arrsarà un solo elemento, la stringa 'aaa'.

Oltre a semplici parentesi è possibile utilizzare l'operatore qw:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

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

print Dumper \@arr;

Quando si esegue questo codice nella matrice @arr sarà 4 elementi di comando 'abc', 'def', 'abc', 'def'.

La documentazione ufficiale di

Ecco un frammento di output del comando perldoc perlop pro operatore 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

Altri articoli