Prédéfini dans la variable $_ en Perl

Toutes les variables dans le langage de programmation Perl qui contiennent une valeur commence par le caractère dollar $. Par exemple, vous pouvez créer une variable $str ou $var.

En Perl, il existe une variable $_. Il ya beaucoup d'endroits dans le langage de programmation Perl où si vous ne spécifiez pas explicitement une variable, utilise la variable $_. Il ya des mots-clés qui lisent la valeur de cette variable, et il y en a qui établissent la valeur de cette variable. Mais dans cette variable, vous enregistrer la valeur et vous-même.

Mots-clés qui lisent la valeur de $_

À titre d'exemple, le mot-clé, qui lit la valeur de дефолтной variable conduire print. Si vous spécifiez print sans arguments, l'écran sera imprimé le contenu de la variable $_.

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

$_ = 'Hello';

print;

Tout d'abord, nous avons conservé dans la variable $_ chaîne 'Hello' (à noter que nous n'avons pas utilisé le mot-clé my).

Et plus loin, nous utilisons print, mais ne communiquons ni aucun argument. Par cette utilisation print affiche le contenu de la variable $_. print; est la même chose que print $_;

Les résultats du programme affiche le texte Hello.

Mots-clés print, say lors de l'utilisation sans arguments utilisent дефолтную variable $_. Il est intéressant que le mot-clé warn lors de l'utilisation sans argument la variable $_ n'utilise pas.

Un autre exemple lorsqu'il est utilisé prédéfini dans une variable est une expression régulière. Afin d'appliquer une expression régulière à une variable, vous devez écrire $str =~ /.../. Et si il suffit d'écrire /.../, c'est la même chose que $_ =~ /.../.

Voici un petit exemple de code:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

$_ = 'Hello';

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

Condition if (/ll/) { vérifieront si la variable $_ , deux lettres de l dans une rangée. Depuis la ligne'Hello' il y a ces deux lettres, il exécute un code print 'yes';, qui affiche le texte yes sur l'écran.

Les mots-clés qui mettent valeur $_

Le plus souvent utilisé le mot-clé, qui modifie la valeur de la variable $_ est foreach. Voici un exemple de code:

▶ Run
#!/usr/bin/perl

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

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

Ici, le corps de la boucle foreach fait 3 fois pour chaque élément de la liste 'one', 'two', 'three'. Avant chaque exécution du corps de la boucle dans la variable $_ est placé à l'élément suivant de la liste. Voilà comment vous pouvez écrire ce cycle indiquant explicitement que la valeur de la placer dans une variable $_: foreach $_ ('one', 'two', 'three') {

Et plus loin, nous utilisons say; que la même chose que say $_;.

Une autre façon de placer une valeur dans une variable $_ , c'est d'utiliser while (<>) {. Voici le code:

#!/usr/bin/perl

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

Ce code lit le contenu de STDIN et affiche chaque ligne comme markdown liste. Voici un exemple de comment travailler avec ce code dans la console:

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

Tout d'abord, nous avons utilisé perl однострочник, qui affiche trois lignes, chaque ligne de chiffre. Et puis, nous avons soustrait de cette conclusion sur la saisie de script que nous venons d'écrire. Le corps de la boucle while (<>) { se fait pour chaque ligne de saisie et cette chaîne est placée dans la variable $_.

Exemple

Voici un autre exemple de code qui utilise activement prédéfini dans la variable $_:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

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

print Dumper \@arr;

Si vous exécutez ce programme, il s'affiche sur l'écran:

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

Donc, ce qui se passe ici. Expression dans laquelle se passe l'affectation des valeurs de tableau @arr besoin de lire de droite à gauche.

  • Tout d'abord, nous avons identifié une liste de trois lignes ('one', 'two', 'three')
  • Plus loin, nous avons utilisé le mot-clé grep à cette liste. grep place de chaque élément de la liste initiale à la variable $_ et effectue un test qui se trouve dans les accolades. Si cette analyse renvoie la vérité, grep renvoie la valeur de la liste. Dans cet exemple, les accolades contiennent une expression régulière, qui s'applique à une дефолтной variable. C'est l'expression régulière répondent uniquement les lignes qui comportent exactement de trois caractères. Le résultat d'un travail grep est une liste de deux lignes ('one', 'two').
  • Une liste de deux éléments tomber dans map. Mot-clé est la place de chaque élément dans la liste дефолтную variable et exécute le code qui est écrit dans les accolades. Un résultat qui renvoie le code est un élément de la liste, qui renvoie map. Dans cet exemple, nous utilisons la fonction lcfirst, qui renvoie une chaîne dont le premier caractère est traduit en majuscules. Si cette fonction ne spécifiez pas un argument, elle fonctionne avec дефолтной variable.

La documentation officielle

Voici un extrait de la sortie de la commande perldoc perlvar pro 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.

Thèmes connexes

Autres articles