Article View: pl.comp.lang.perl
Article #746Re: Lokalnosc wektorow (OWWNKCW na temat local i my)
From: Piotr Piatkowski
Date: Thu, 04 Dec 1997 15:09
Date: Thu, 04 Dec 1997 15:09
82 lines
3392 bytes
3392 bytes
Krzysztof Juszkiewicz <juszkiew@kt.agh.edu.pl> wrote:
: Witam.
: Ostatnio mialem problem, ktory rozwiazalem, ale chce sie zabezpieczyc na
: przyszlosc.
: Napisalem sobie funkcje gdzie bylo:
: fn {
: local @array;
: push @array, $costam
: ...
: }
: i okazalo sie, ze przy wywolaniu kolejnym funkcji w @array najduja sie
: elementy z poprzedniego wywolania.
: Czy istnieje jakis sposob, zeby tego uniknac inny niz napisanie wprost
: @array=();
Po pierwsze - zmienne deklarowane z local lub z my otrzymują zawsze
wartości niezdefiniowane, chyba że podamy wartości początkowe, np.
tak:
local @array = ( );
I to właściwie kończy odpowiedź na pytanie. Ale teraz, jako że mam
trochę czasu, "O Wiele Więcej Niż Kiedykolwiek Chciałbyś Wiedzieć"
na temat my i local :-)
Nie należy używać local tylko my. Ale to nie tyle ze względu na
inicjalizację, ile dlatego, że to właśnie my służy do tego do czego
wszystkim się wydaje że służy local :-)
Local wcale nie robi zmiennej lokalnej - a tylko zapisuje wartość
zmiennej globalnej, która ciągle pozostaje zmienną globalną, a po
zakończeniu aktualnego bloku wartość tej zmiennej odtwarza. Czyli
taka sekwencja:
sub fn {
local $x;
# instrukcje...
}
jest równoważna (mniej więcej) czemuś takiemu:
sub fn {
$save_x = $x;
# instrukcje...
$x = $save_x
}
W szczególności, jeżeli z funkcji fn wywołamy inne funkcje, to będą one
mogły bez przeszkód operować na "lokalnej" zmiennej, tak samo jak na
zmiennej globalnej - z tą tylko różnicą że zmiany zostaną później
odtworzone, przy wyjściu z bloku w którym wystąpiło local.
Natomiast my (składnia identyczna jak local) robi właśnie to co się
przyjęło uważać za zmienną lokalną - tworzy zmienną dynamiczną,
widzianą tylko w obrębie danego bloku leksykalnego, mniej więcej tak
jak dzieje się ze zmiennymi automatycznymi w C.
Dotatkowo my jest szybsze.
Skoro my należy używać zamiast local, to do czego służy local? Ano
właśnie do tego co robi - do sytuacji gdy potrzebujemy na chwilę
nadać jakiejś zmiennej globalnej inną wartość, ale dobrze by było
żeby wartość aktualna została później automatycznie odtworzona. Czyli
np. tak:
sub xxx {
...
local $/ = undef;
my $contents = <FILE>;
return $contents;
}
Dzięki ustawieniu $/ na undef, funkcja <FILE> wczyta cały plik (a nie
jedną linijkę), ale dzięki użyciu deklaracji local, po wyjściu z
funkcji zmienna $/ będzie miała taką wartość jak przy wejściu.
--
Piotr Piątkowski, Uczelniane Centrum Informatyki, AGH Krakow, POLAND
Technical Details
Message-ID:
<666h46$940$1@galaxy.uci.agh.edu.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!news.icm.edu.pl!news.onet.pl!agh.edu.pl!agh.edu.pl!not-for-mailReferences:
<34869059.15EE142E@kt.agh.edu.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!news.icm.edu.pl!news.onet.pl!agh.edu.pl!agh.edu.pl!not-for-mail From: Piotr Piatkowski <kompas@galaxy.uci.agh.edu.pl> Newsgroups: pl.comp.lang.perl Subject: Re: Lokalnosc wektorow (OWWNKCW na temat local i my) Date: 4 Dec 1997 16:09:58 +0100 Organization: University of Mining & Metallurgy Lines: 82 Message-ID: <666h46$940$1@galaxy.uci.agh.edu.pl> References: <34869059.15EE142E@kt.agh.edu.pl> NNTP-Posting-Host: galaxy.uci.agh.edu.pl Mime-Version: 1.0 X-Newsreader: TIN [UNIX 1.3 unoff BETA 971018; sun4m SunOS 5.5.1] Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit