Дефолтная 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
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 $_ =~ /.../
.
▶ Run
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
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:
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
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
Some parts of this page were machine translated.
Powered by Yandex.Translate
http://translate.yandex.com/