Дефолтная variável $_ em Perl

Todas as variáveis em uma linguagem de programação Perl que contêm em si um valor começam com o símbolo do dólar $. Por exemplo, você pode criar uma variável $str ou $var.

Em Perl existe uma variável especial $_. Há muitos lugares na linguagem de programação Perl onde se não especificar explicitamente a variável será usada a variável $_. Existem palavras-chave que lêem os valores desta variável, até que definem os valores a esta variável. Mas essa variável pode ser manter o valor e a si mesmo.

Palavras-chave que lêem o valor dos $_

Como exemplo de uma palavra-chave, que lê o valor da variável pode ser дефолтной levar print. Se você especificar VKLYKOSTOEXK a 9, sem argumentos, a tela será impresso o conteúdo de uma variável $_.

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

$_ = 'Hello';

print;

Primeiro temos armazenado na variável $_ linha de 'Hello' (tenha em atenção o que nós não usamos a palavra-chave my).

E em seguida nós usamos o print, mas não deixamos-lhe nenhum argumento. Quando tal uso print exibe o conteúdo da variável $_. print; é o mesmo que print $_;

Resultado — o programa exibirá o texto Hello.

Palavras-chave print, say quando utilizado sem argumentos usam дефолтную variável $_. Interessante que a palavra-chave warn quando você usa sem argumentos variável $_ não usa.

Outro exemplo, quando usado дефолтная variável é uma expressão regular. Para utilizar uma expressão regular para a variável precisa escrever $str =~ /.../. E se você acabou de escrever /.../, que é o mesmo que $_ =~ /.../.

Aqui está um exemplo de código:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

$_ = 'Hello';

if (/ll/) {
    print 'yes';
} else {
    print 'no';
}

A condição de if (/ll/) { , verificar se existe a variável $_ duas letras l em uma fileira. Uma vez que a linha'Hello' existem essas duas letras, então o código é executado print 'yes';, que exibe o texto yes na tela.

Palavras-chave, que colocam o valor $_

A mais comumente usada a palavra-chave, que altera o valor da variável $_ é foreach. Aqui está um exemplo de código:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use feature qw(say);

foreach ('one', 'two', 'three') {
    say;
}

Aqui o corpo de um ciclo foreach executado 3 vezes para cada item da lista 'one', 'two', 'three'. Antes de cada execução do corpo do loop a variável $_ colocado o item seguinte da lista. Assim você pode gravar este ciclo com uma clara indicação de que o valor deve ser colocado em uma variável de $_: foreach $_ ('one', 'two', 'three') {

E em seguida nós usamos o say; que é o mesmo que say $_;.

Outra maneira de colocar o valor em uma variável de $_ é usar while (<>) {. Aqui está o código:

#!/usr/bin/perl

while (<>) {
    print " * $_";
}

Este código lê o conteúdo de STDIN e imprime cada linha como markdown lista. Eis um exemplo de como trabalhar com este código no console:

$ perl -e 'print "1\n2\n3\n"' | perl script.pl
 * 1
 * 2
 * 3

Primeiro usamos o perl однострочник, que exibe três linhas, cada linha de figura. E então nós redirecionado a esta conclusão sobre a entrada de script que acabamos de escrever. O corpo de um ciclo while (<>) { executado para cada linha de entrada e esta linha é colocado na variável $_.

Exemplo

Aqui está um exemplo de código no qual o ativo é utilizado дефолтная variável $_:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my @arr = map { ucfirst } grep { /^.{3}\z/ } ('one', 'two', 'three');

print Dumper \@arr;

Se você executar o programa, aparecerá na tela:

$VAR1 = [
          'One',
          'Two'
        ];

Então, o que está acontecendo aqui. A expressão em que ocorre a atribuição de valores de uma matriz @arr você precisa ler da direita para a esquerda.

  • Primeiro, definimos uma lista de três linhas ('one', 'two', 'three')
  • A seguir usamos a palavra-chave grep a esta lista. grep coloca cada item a partir da lista inicial na variável $_ e executa uma verificação, que está registrada em chaves. Se este teste retorna verdadeiro, o grep retorna um valor da lista. Neste exemplo, entre colchetes contém uma expressão regular, que se aplica a дефолтной variável. É uma expressão regular satisfazem apenas as linhas que consistem exatamente três caracteres. O resultado do trabalho de grep — esta é a lista que já a partir de duas linhas de ('one', 'two').
  • Lista de dois elementos cair no map. Esta palavra-chave coloca cada item de lista дефолтную a variável e executa o código que está escrito entre colchetes. O resultado que retorna o código é um elemento de uma lista, que retorna map. Neste exemplo, usamos a função lcfirst, que retorna uma cadeia de caracteres que o primeiro caractere traduzido em letras maiúsculas. Se esta função não especificar um argumento, então ele funciona com дефолтной variável.

A documentação oficial

Aqui está um trecho da saída do comando perldoc perlvar sobre a variável $_:

    $_      The default input and pattern-searching space. The following
            pairs are equivalent:

                while (<>) {...}    # equivalent only in while!
                while (defined($_ = <>)) {...}

                /^Subject:/
                $_ =~ /^Subject:/

                tr/a-z/A-Z/
                $_ =~ tr/a-z/A-Z/

                chomp
                chomp($_)

            Here are the places where Perl will assume $_ even if you don't
            use it:

            *  The following functions use $_ as a default argument:

               abs, alarm, chomp, chop, chr, chroot, cos, defined, eval,
               evalbytes, exp, fc, glob, hex, int, lc, lcfirst, length, log,
               lstat, mkdir, oct, ord, pos, print, printf, quotemeta,
               readlink, readpipe, ref, require, reverse (in scalar context
               only), rmdir, say, sin, split (for its second argument),
               sqrt, stat, study, uc, ucfirst, unlink, unpack.

            *  All file tests ("-f", "-d") except for "-t", which defaults
               to STDIN. See "-X" in perlfunc

            *  The pattern matching operations "m//", "s///" and "tr///"
               (aka "y///") when used without an "=~" operator.

            *  The default iterator variable in a "foreach" loop if no other
               variable is supplied.

            *  The implicit iterator variable in the "grep()" and "map()"
               functions.

            *  The implicit variable of "given()".

            *  The default place to put the next value or input record when
               a "", "readline", "readdir" or "each" operation's result
               is tested by itself as the sole criterion of a "while" test.
               Outside a "while" test, this will not happen.

            $_ is a global variable.

            However, between perl v5.10.0 and v5.24.0, it could be used
            lexically by writing "my $_". Making $_ refer to the global $_
            in the same scope was then possible with "our $_". This
            experimental feature was removed and is now a fatal error, but
            you may encounter it in older code.

            Mnemonic: underline is understood in certain operations.

Temas relacionados

Outros artigos