Дефолтная variable $_ en Perl

Todas las variables en el lenguaje de programación Perl que contienen en sí mismos un valor comienzan con el símbolo del dólar $. Por ejemplo, puede crear una variable $str o $var.

En Perl hay una variable especial $_. Hay muchos lugares en el lenguaje de programación Perl donde si explícitamente no se especifica la variable, se utiliza la variable $_. Hay palabras que se leen los valores de esta variable, y hay, que establecen los valores en esta variable. Pero en esta variable guardar el valor en y por sí mismo.

Las palabras clave que leen el valor de $_

Como ejemplo de la palabra clave que lee el valor de дефолтной de la variable se puede llevar print. Si especifica print sin argumentos, en la pantalla se imprime el contenido de la variable $_.

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

$_ = 'Hello';

print;

Primero que hemos guardado en la variable $_ cadena de 'Hello' (tenga en cuenta que no hemos utilizado la palabra clave my).

Y luego utilizamos print, pero no le transmitimos ningún argumento. De este modo, la print muestra el contenido de la variable $_. print; es lo mismo que print $_;

El resultado, el programa mostrará un texto Hello.

Palabras clave print, say si se utiliza sin argumentos utilizan дефолтную variable $_. Es interesante que la palabra clave warn cuando se utiliza sin argumentos variable $_ no se utiliza.

Otro ejemplo, cuando se utiliza дефолтная una variable es una expresión regular. Para aplicar la expresión regular a la variable de la necesidad de escribir $str =~ /.../. Y si simplemente escribir /.../, es lo mismo que $_ =~ /.../.

He aquí un pequeño ejemplo de código:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

$_ = 'Hello';

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

La condición de if (/ll/) { comprueba si hay en la variable $_ dos letras l en una fila. Dado que en la barra de'Hello' hay estas dos letras, entonces se ejecuta el código de print 'yes';, que muestra el texto yes en la pantalla.

Las palabras clave que se coloca el valor en $_

El más a menudo se usa la palabra clave que cambia el valor de la variable $_ es foreach. He aquí un ejemplo de código:

▶ Run
#!/usr/bin/perl

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

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

Aquí el cuerpo del ciclo de foreach se realiza 3 veces para cada elemento de la lista 'one', 'two', 'three'. Antes de cada ejecución del cuerpo del ciclo en la variable $_ se añade el siguiente elemento de la lista. Así es como se pueden grabar este ciclo explícitamente que es necesario colocar en la variable $_: foreach $_ ('one', 'two', 'three') {

Y luego utilizamos say; que es lo mismo que say $_;.

Otra manera de poner un valor en la variable $_ es utilizar while (<>) {. Aquí está el código:

#!/usr/bin/perl

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

Este código lee el contenido de la entrada estándar (STDIN) y muestra cada línea como markdown la lista. He aquí un ejemplo de como trabajar con este código en la consola:

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

Primero utilizamos el perl однострочник, que muestra tres líneas, en cada línea de la figura. Y luego nos modificaron esta conclusión la introducción de un script que hemos escrito. El cuerpo del bucle while (<>) { se realiza para cada fila de la entrada y esta línea se coloca en la variable $_.

Ejemplo

He aquí otro ejemplo de código en el que se utiliza activamente дефолтная variable $_:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

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

print Dumper \@arr;

Si ejecuta este programa, en la pantalla aparecerá:

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

Así, lo que pasa aquí. La expresión en el que se produce la asignación de valores a una matriz de @arr debe leer de derecha a izquierda.

  • Primero definimos una lista de tres filas ('one', 'two', 'three')
  • Más allá, hemos utilizado la palabra clave grep a esta lista. grep coloca cada elemento de la lista inicial de la variable de $_ y comprueba que está grabado en paréntesis. Si esta comprobación devuelve la verdad, es grep devuelve el valor de la lista. En este ejemplo, las llaves se contiene la expresión regular que se aplica a дефолтной de la variable. Es una expresión regular cumplen sólo las filas que contienen exactamente tres caracteres. El resultado del trabajo de grep — esta es la lista de ya dos filas ('one', 'two').
  • Lista de dos elementos de caer en map. Esta es la palabra clave coloca cada elemento de la lista en дефолтную variable y ejecuta el código que está escrito entre paréntesis. El resultado que devuelve el código es un elemento de la lista que devuelve map. En este ejemplo se utiliza la función de lcfirst, que devuelve una cadena que el primer carácter traducido en mayúsculas. Si esta función no se especifica un argumento, entonces funciona con дефолтной de la variable.

La documentación oficial

He aquí un fragmento de la salida del comando perldoc perlvar sobre la variable $_:

    $_      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

Otros articulos