Standard Variable $_ in Perl

Alle Variablen in der Programmiersprache Perl, die enthalten einen einzelnen Wert beginnen mit einem Dollar $. Beispielsweise können Sie eine Variable $str oder $var.

In Perl gibt es eine spezielle Variable $_. Es gibt viele Orte in der Programmiersprache Perl wo wenn nicht explizit angeben, eine Variable, dann wird die Variable $_. Es gibt Stichworte, die Lesen die Werte aus dieser Variable, und es gibt solche, die Festlegung der Werte in diese Variable. Aber in dieser Variable speichern Sie den Wert und selbständig.

Stichworte, die zu Lesen den Wert aus $_

Als Beispiel für ein Schlüsselwort, das liest den Wert aus дефолтной Variable können führen print. Wenn Sie print ohne Argumente, wird auf dem Bildschirm gedruckt wird der Inhalt der Variablen $_.

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

$_ = 'Hello';

print;

Wir haben zuerst in einer Variablen $_ Zeile 'Hello' (bitte beachten Sie was wir nicht nutzten Stichwort my).

Und dann verwenden wir print, aber nicht geben ihm keine Argumente. Bei einer solchen Verwendung print zeigt den Inhalt der Variable $_. print; ist das gleiche wie print $_;

Das Ergebnis — das Programm zeigt den Text Hello.

Stichworte print, say bei Verwendung ohne Argumente verwenden дефолтную Variable $_. Interessant ist, dass das Schlüsselwort warn bei der Verwendung ohne Argumente Variable $_ nicht verwendet.

Ein anderes Beispiel wird verwendet, wenn Standard-Variable ist ein regulärer Ausdruck. Damit Sie einen regulären Ausdruck an eine Variable zu schreiben $str =~ /.../. Und wenn Sie einfach schreiben /.../, dann ist es das gleiche wie $_ =~ /.../.

Hier ein kleiner Beispielcode:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

$_ = 'Hello';

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

Bedingung if (/ll/) { prüfen ob in der Variable $_ zwei Buchstaben l hintereinander. Da in der'Hello' es gibt diese zwei Buchstaben, dann wird der Code print 'yes';, der Text zeigt yes auf dem Bildschirm.

Stichworte, die legen Wert $_

Das Häufig verwendete Schlüsselwort, das ändert den Wert der Variablen $_ ist foreach. Hier ist der Beispielcode:

▶ Run
#!/usr/bin/perl

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

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

Hier die Körper der Schleife foreach erfolgt 3 mal für jedes Element aus der Liste 'one', 'two', 'three'. Vor jeder Ausführung der Schleife in eine Variable $_ passt das nächste Element aus der Liste. Hier kann man also schreiben dieser Zyklus mit der expliziten Angabe, dass der Wert sollte in einer Variable $_: foreach $_ ('one', 'two', 'three') {

Und dann verwenden wir say; was dasselbe ist und was say $_;.

Ein anderer Weg, um den Wert in die Variable $_ ist zu verwenden while (<>) {. Hier ist der Code:

#!/usr/bin/perl

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

Dieser Code liest den Inhalt von STDIN und gibt jede Zeile als markdown-Liste. Hier ist ein Beispiel wie arbeiten mit diesem Code in der Konsole:

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

Zunächst setzten wir die perl-Einzeiler, die zeigt drei Zeilen, in jeder Zeile eine Zahl. Und dann haben wir weiter geleitet zur Eingabe dieser Pin-Skript, das wir gerade geschrieben haben. Körper-Zyklus while (<>) { erfolgt für jede Zeile der Eingabe und diese Zeile wird in die Variable $_.

Beispiel

Hier ist ein weiteres Beispiel für Code, der aktiv verwendet Standard Variable $_:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

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

print Dumper \@arr;

Wenn Sie dieses Programm starten, dann erscheint auf dem Bildschirm:

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

Also, was hier passiert. Der Ausdruck in dem die Zuweisung von platzhalterwerten array @arr zu Lesen von rechts nach Links.

  • Zunächst kennzeichneten wir eine Liste mit drei Zeilen ('one', 'two', 'three')
  • Weiter verwendeten wir das Schlüsselwort grep zu dieser Liste. grep ordnet jedes Element der ursprünglichen Liste in eine Variable $_ und überprüft, die in geschweiften Klammern geschrieben. Wenn diese überprüfung gibt wahr zurück, dann grep gibt den Wert der Liste. In diesem Beispiel wird in geschweiften Klammern enthält einen regulären Ausdruck, der trifft auf дефолтной Variable. Das mit dem regulären Ausdruck entsprechen nur die Zeilen bestehen aus genau drei Zeichen. Das Ergebnis der Arbeit grep — dies ist die Liste der bereits aus zwei Zeilen ('one', 'two').
  • Eine Liste aus zwei Elementen fallen in map. Dieses Schlüsselwort legt jedes Element in der Liste дефолтную Variable und führt den Code, der in geschweiften Klammern geschrieben. Das Ergebnis zurückgibt der Code ist ein Element der Liste zurückgibt map. In diesem Beispiel verwenden wir die Funktion lcfirst, die gibt einen String zurück, bei dem das erste Zeichen in Großbuchstaben übersetzt. Wenn diese Funktion nicht ein argument angegeben, dann funktioniert es mit дефолтной Variable.

Die offizielle Dokumentation

Hier ist ein Ausschnitt der Ausgabe des Befehls perldoc perlvar über die 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.

Verwandte Themen

Andere Artikel