Дефолтная zmienna $_ w Perl

Wszystkie zmienne w języku programowania Perl które zawierają w sobie jedną wartość rozpoczynają się od znaku dolara $. Na przykład, można utworzyć zmienną $str lub $var.

W Perlu istnieje specjalna zmienna $_. Jest wiele miejsc w języku programowania Perl gdzie jeśli wyraźnie nie określono zmienną, to zostanie użyta zmienna $_. Są słowa kluczowe, które czytają wartości tej zmiennej, a są takie, które wyznaczają wartości do tej zmiennej. Ale w tej zmiennej można zapisać wartość i samodzielnie.

Słowa kluczowe, które czytają wartość z $_

Jako przykład słowo kluczowe, które odczytuje wartość zmiennej można дефолтной to print. Jeśli określić print bez argumentów, to na ekranie zostanie wydrukowany zawartość zmiennej $_.

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

$_ = 'Hello';

print;

Najpierw mamy zapisane w zmiennej $_ wiersz 'Hello' (uwaga że nie wykorzystaliśmy słowo kluczowe my).

A dalej używamy print, ale nie przekazujemy mu żadne argumenty. Przy takim użyciu print wyprowadzi na ekran zawartość zmiennej $_. print; to jest to samo co print $_;

Wynik — program wyświetla na ekranie tekst Hello.

Słowa kluczowe print, say przy użyciu bez argumentów używają дефолтную zmienną $_. Ciekawe, że słowo kluczowe warn przy użyciu bez argumentów zmienną $_ nie używa.

Inny przykład kiedy jest używany дефолтная zmienna — to wyrażenia regularne. Aby zastosować wyrażenie regularne do zmiennej trzeba napisać $str =~ /.../. A jeśli po prostu napisz do /.../, to to jest to samo co $_ =~ /.../.

Oto mały przykład kodu:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

$_ = 'Hello';

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

Warunek if (/ll/) { sprawdzą czy w zmiennej $_ dwie litery l z rzędu. Ponieważ w wierszu'Hello' te dwie litery, to wykonywany jest kod print 'yes';, który wyświetla tekst yes na ekran.

Słowa kluczowe, które umieszcza wartość w $_

Najbardziej często używane słowo kluczowe, które zmienia wartość zmiennej $_ — to foreach. Oto przykład kodu:

▶ Run
#!/usr/bin/perl

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

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

Tutaj ciało cyklu foreach odbywa się 3 razy dla każdego elementu z listy 'one', 'two', 'three'. Przed każdym wykonaniem pętli w zmiennej $_ umieszcza się następny element z listy. Tak, można nagrać ten cykl z wyraźnym wskazaniem, że wartość należy umieścić w zmiennej $_: foreach $_ ('one', 'two', 'three') {

A dalej używamy say; , że to samo, co say $_;.

Inny sposób umieścić wartość w zmiennej $_ to wykorzystać while (<>) {. Oto kod:

#!/usr/bin/perl

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

Ten kod odczytuje zawartość STDIN i wyświetla każdą linię z markdown lista. Oto przykład jak pracować z tym kodem w konsoli:

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

Najpierw używaliśmy perl jedno-liner, który wyświetla trzech wierszy, w każdym wierszu cyfra. A dalej było przekierowanie ten wniosek o wprowadzenie skryptu, który właśnie napisał. Ciało cyklu while (<>) { jest spełniony dla każdego wiersza z wprowadzania i wiersz ten jest umieszczany w zmiennej $_.

Przykład

Oto jeszcze jeden przykład kodu w którym aktywnie używany дефолтная zmienna $_:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

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

print Dumper \@arr;

Po uruchomieniu programu, na ekranie pojawi się:

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

Więc, co tu się dzieje. Wyrażenie, w którym występuje przypisanie wartości tablicy @arr trzeba czytać od prawej do lewej.

  • Najpierw ustaliliśmy listę z trzech wierszy ('one', 'two', 'three')
  • Dalej użyliśmy słowa kluczowego grep do tej listy. grep umieszcza każdy element z pierwotnej listy do zmiennej $_ i sprawdza, która jest zapisana w nawiasach klamrowych. Jeśli weryfikacja ta zwraca prawdę, to grep zwraca wartość z listy. W tym przykładzie w nawiasach klamrowych zawiera wyrażenie regularne, które stosuje się do дефолтной zmiennej. To zareagowałaby spełniają tylko wiersze, które składają się dokładnie z trzech znaków. Wynik pracy grep — jest to lista z dwóch wierszy ('one', 'two').
  • Lista z dwóch elementów wpadnie w map. To słowo kluczowe umieszcza każdy element listy w дефолтную zmienną i wykonuje kod, który jest napisany w nawiasach klamrowych. Wynik który zwraca kod jest elementem listy, która zwraca map. W tym przykładzie używamy funkcji lcfirst, która zwraca ciąg znaków który pierwszy znak przeniesiony na wielkie litery. Jeśli tej funkcji nie podać argument, pracuje z дефолтной zmiennej.

Oficjalna dokumentacja

Oto fragment danych wyjściowych polecenia perldoc perlvar o zmiennej $_:

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

Tematy pokrewne

Inne artykuły