O operador x em Perl

O operador x se comporta de forma diferente dependendo de como ele é usado.

Em скалярном contexto, ele é utilizado para criar seqüências de comprimento de caracteres repetidos. Pode-se dizer que este operador faz a "multiplicação" das linhas.

Folha de pagamento do contexto (e se o operando esquerdo escrito entre parênteses ou com o uso de um operador qw), ele repete o item de número de vezes especificado.

Aqui está um exemplo de trabalho de operador de x em скалярном contexto:

▶ Run
#!/usr/bin/perl

my $str = 'A' x 4;

print $str;

O programa exibirá uma linha composta de quatro caracteres 'A': 'AAAA'.

Se do lado esquerdo, operando indirecto indicado de vários personagens, todos eles serão repetidos:

▶ Run
#!/usr/bin/perl

my $str = 'Abc' x 2;

print $str;

Este exemplo exibe uma linha 'AbcAbc'.

O uso de seqüência de caracteres vazia

Em скалярном contexto operador x repete a seqüência de caracteres especificada no canto operando indirecto o número de vezes especificado no direito operando indirecto.

Se você especificar como a esquerda operando uma linha em branco '', em скалярном contexto, o resultado será sempre uma linha em branco, independentemente da o valor do operando à direita:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my $str = '' x 100;

print Dumper $str;

A conclusão do programa será visto que, em $str contém uma cadeia de caracteres vazia.

Não faz sentido usar este operador em скалярном contexto de uma cadeia vazia.

O valor do operando à direita

Em скалярном contexto, o operando da direita na instrução x diz quantas vezes precisar repetir a seqüência que aparece no canto esquerdo operando indirecto. Nesse caso, se o operando é um número inteiro positivo, então é óbvio que acontece.

Mas os números não são positivos.

  • No caso, se o operando da direita é o número de 0, o resultado é sempre uma linha em branco.
  • Se o operando da direita é um número negativo, o resultado também é sempre uma linha em branco.

Se o código tiver use warnings;, então o uso de um número negativo como um direito o operador exibe o aviso. Aqui está um exemplo de script que exibe a seqüência de 'Negative repeat count does nothing at script.pl line 5.'.

▶ Run
#!/usr/bin/perl

use warnings;

my $str = 'a' x -3;

print $str;

Se o operando da direita é um número positivo com a parte fracionária, é esta a parte fracionária de simplesmente descartados. O resultado 'A' x 2.1 é exatamente o mesmo como 'A' x 2.99 — seqüência de 'AA'.

Списочный contexto

Folha de pagamento contexto operador x reitera o item. Mas, além disso, que precisa de списочный contexto, a necessidade de ainda e colocar o operando esquerdo em parênteses. O código a seguir cria uma matriz de @arr que contém o item 3, cada elemento é uma linha 'a':

▶ Run
#!/usr/bin/perl

use Data::Dumper;

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

print Dumper \@arr;

Mas se você não especificar um parênteses no canto operando indirecto, mas escrever my @arr = 'a' x 3;, então a matriz @arrserá um item de linha 'aaa'.

Além de simples de parênteses pode usar o operador de qw:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

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

print Dumper \@arr;

Quando você executa este código na matriz @arr será de 4 elementos, a linha de 'abc', 'def', 'abc', 'def'.

A documentação oficial

Aqui está um trecho da saída do comando perldoc perlop sobre o operador 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

Outros artigos