El operador de x en Perl

El operador de x se comporta de manera diferente dependiendo de cómo se utiliza.

En скалярном el contexto se utiliza para crear una línea de la longitud deseada del caracteres repetidos. Se puede decir que este operador hace "multiplicar" para las filas.

En списочном contexto (y si el operando de la izquierda es anotado entre paréntesis o con el uso del operador de qw) se repite el elemento de número de veces especificado.

He aquí un ejemplo de trabajo de operador de x en скалярном el contexto:

▶ Run
#!/usr/bin/perl

my $str = 'A' x 4;

print $str;

El programa mostrará en pantalla una cadena compuesta de cuatro caracteres 'A': 'AAAA'.

Si el operando de la izquierda se indica más caracteres, cada uno de ellos se repiten:

▶ Run
#!/usr/bin/perl

my $str = 'Abc' x 2;

print $str;

Este ejemplo muestra la cadena de 'AbcAbc'.

El uso de una cadena vacía

En скалярном el contexto de la instrucción x repite la línea que aparece en el operando de la izquierda el número de veces que se indica en su operando derecho.

Si especifica como del operando a la izquierda una cadena vacía '', en скалярном contexto, el resultado siempre será una cadena vacía, independientemente de la el valor del operando derecho:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my $str = '' x 100;

print Dumper $str;

De la conclusión del programa se ve que en $str contiene una cadena vacía.

No tiene sentido utilizar este operador en скалярном el contexto de la cadena vacía.

El valor del operando derecho

En скалярном el contexto de la derecha operando en la instrucción de la x dice cuantas veces es necesario repetir una cadena que contiene el operando de la izquierda. En ese caso, si el operando es un entero positivo, entonces es obvio que resultará en el resultado.

Pero los números no son positivos.

  • En el caso de si el operando a la derecha es el número de 0, el resultado es siempre una cadena vacía.
  • Si el operando derecho es un número negativo, el resultado es siempre una cadena vacía.

En el caso de que en el código hay use warnings;, el uso de un número negativo, como la de la derecha el operador mostrará un mensaje de advertencia. He aquí un ejemplo de un script que se mostrará en la pantalla de la cadena 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 el operando derecho es un número positivo con la parte fraccionaria es esta la parte fraccionaria simplemente se descarta. El resultado de la 'A' x 2.1 será igual que 'A' x 2.99 — cadena de 'AA'.

La lista de contexto

En списочном el contexto de la instrucción x repite el elemento. Pero, además de que se necesita la lista de contexto, es necesario aún y colocar el operando de la izquierda entre paréntesis. El código siguiente crea una matriz de @arr que contiene 3 de un elemento, cada elemento es una cadena de 'a':

▶ Run
#!/usr/bin/perl

use Data::Dumper;

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

print Dumper \@arr;

Pero si no se especifica entre paréntesis de la izquierda el operando, y escribir my @arr = 'a' x 3;, en la matriz de @arrse sólo un elemento de la cadena de 'aaa'.

Además de simples paréntesis, puede utilizar el operador qw:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

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

print Dumper \@arr;

Cuando se ejecuta este código, en la matriz de @arr será de 4 elemento de la cadena 'abc', 'def', 'abc', 'def'.

La documentación oficial

He aquí un fragmento de la salida del comando perldoc perlop sobre el operador de 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

Otros articulos