Standard variable $_ i Perl

Alle variabler i programmeringssproget Perl, der indeholder en enkelt værdi start med dollar $. For eksempel, kan du oprette en variabel $str eller $var.

I Perl, der er en særlig variabel $_. Der er mange steder i programmeringssprog Perl, hvor, hvis du ikke udtrykkeligt angiver en variabel, vil den variable vil blive brugt $_. Der er nøgle ord at læse værdier fra denne variabel, og der er dem, hvilke sæt af værdier, der i denne variabel. Men i denne variabel gemme værdien på deres egne.

Nøgleord at læse værdien fra $_

Som et eksempel på et søgeord, der læser værdien af standard variabel føre print. Hvis du angiver print uden argumenter, skærmen vil udskrive indholdet af en variabel $_.

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

$_ = 'Hello';

print;

Det første, vi, der er gemt i en variabel $_ linje 'Hello'(bemærk! vi har ikke brugt den nøgle ord my).

Og så bruger vi print, men ikke sende det til nogen argumenter. I denne brug print viser indholdet af en variabel $_. print; er den samme som print $_;

Resultatet — programmet vil vise teksten Hello.

Nøgleord print, say , når de anvendes uden argumenter, der er brugt standard variable $_. Det er interessant, at det vigtigste ord warn , når du bruger uden argumenter variabel $_ ikke bruger.

Et andet eksempel, når du bruger standard-variabel er et regulært udtryk. For at anvende et regulært udtryk til en variabel, som du har brug for at skrive $str =~ /.../. Og hvis du bare skrive /.../, det er det samme som $_ =~ /.../.

Her er et lille eksempel på kode:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

$_ = 'Hello';

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

Betingelse if (/ll/) { tjekke, om variablen $_ to breve l i træk. Fordi i overensstemmelse'Hello' der er disse to breve, så koden kører print 'yes';, som viser teksten yes på skærmen.

Søgeord, der sætter værdi i $_

De mest benyttede nøgleord, der ændrer værdien af variablen $_ er foreach. Her er et eksempel kode:

▶ Run
#!/usr/bin/perl

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

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

Her kroppen af løkken foreach udføres 3 gange for hvert element på listen 'one', 'two', 'three'. Inden hver udførelse af løkken krop i variabel $_ er placeret ved siden element fra listen. Så du kan optage denne cyklus med en klar angivelse af, hvilken værdi bør være placeret i en variabel $_: foreach $_ ('one', 'two', 'three') {

Og så bruger vi say; , som er det samme som say $_;.

En anden måde at placere en værdi i en variabel $_ er at bruge while (<>) {. Her er koden:

#!/usr/bin/perl

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

Denne kode læser STDIN og udgange hver linje som en markdown liste. Her er et eksempel på, hvordan at arbejde med denne kode i konsollen:

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

Det første, vi brugte perl odnotrahniki, som viser tre linier, hver linie figur. Og så har vi omdirigeret dette output til input af et script, som vi lige har skrevet. Kroppen af løkken while (<>) { er udført for hver linje med input, og denne streng er placeret i den variable $_.

Eksempel

Her er et andet eksempel på kode som bruges aktivt standard variable $_:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

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

print Dumper \@arr;

Hvis du kører dette program, vil den blive vist på skærmen:

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

Så, hvad sker der her. Udtryk, hvor der er en tildeling af værdier til arrayet @arr du er nødt til at læse fra højre til venstre.

  • For det første, har vi identificeret en liste over tre strenge ('one', 'two', 'three')
  • Så, vi brugte søgeord grep til denne liste. grep steder hvert element fra den oprindelige liste til en variabel $_ og kontrol, som er skrevet i krøllede parenteser. Hvis denne test returnerer true, så grep returnerer værdien af listen. I dette eksempel, de krøllede parenteser indeholder et regulært udtryk, der er anvendt til standard variabel. Dette regulære udtryk vil tilfredsstille kun bånd, der består af netop tre tegn. Resultatet af grep er en liste af to strenge ('one', 'two').
  • En liste med to elementer, der falder ind map. Dette søgeord sætter hvert element på listen i standard variable og udfører den kode, der er skrevet i krøllede parenteser. Det resultat, der vender tilbage koden er et element på listen, der returnerer map. I dette eksempel bruger vi funktionen lcfirst, der returnerer en streng, hvis første tegn er skrevet med store bogstaver. Hvis denne funktion ikke angive et argument, så det virker med standard variabel.

Officiel dokumentation

Her er et uddrag af output perldoc perlvar Pro variabel $_:

    $_      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 "<FH>", "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.

Relaterede emner

Andre artikler