Thread View: pl.comp.lang.perl
5 messages
5 total messages
Started by Krzysztof Juszkiewicz
Thu, 04 Dec 1997 11:13
Lokalnosc wektorow
Author: Krzysztof Juszkiewicz
Date: Thu, 04 Dec 1997 11:13
Date: Thu, 04 Dec 1997 11:13
20 lines
1328 bytes
1328 bytes
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=();
TIA Krzysiek
--
Krzysztof Juszkiewicz mailto:juszkiew@kt.agh.edu.pl IRC: jchris
_ _ ___ http://www.kt.agh.edu.pl/~jchris ICQ: 3140890
| |/ / |_ _| Dept. of Telecommunications tel. +4812 6173638
|_|\_\ |_| Univ. of Mining & Metalurgy fax. 6342372
30-059 Krakow, Poland tel. secr. 6345582
Re: Lokalnosc wektorow
Author: Michal Trojnara
Date: Thu, 04 Dec 1997 13:30
Date: Thu, 04 Dec 1997 13:30
13 lines
1165 bytes
1165 bytes
Krzysztof Juszkiewicz wrote: > Ostatnio mialem problem, ktory rozwiazalem, ale chce sie zabezpieczyc na > przyszlosc. Proste: Nigdy, w zadnym jezyku nie uzywaj niejawnego, automatycznego inicjowania zmiennych. Jest to nieeleganckie, nawet jesli czasami dziala. W szczegolnosci nie nalezy takiego inicjowania uzywac tam, gdzie go nie ma. 8-) -- | E-mail -> mailto:mtrojnar@ddc.daewoo.com.pl | Michal Trojnara | | Strona -> http://www.daewoo.com.pl/~mtrojnar/ | 090-29-83-44 | | CHSI -> http://www.chsi.rubikon.net.pl/ | Jezus jest Panem |
Re: Lokalnosc wektorow (OWWNKCW na temat local i my)
Author: 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
Re: Lokalnosc wektorow
Author: Piotr Budrewicz
Date: Thu, 04 Dec 1997 16:51
Date: Thu, 04 Dec 1997 16:51
15 lines
978 bytes
978 bytes
Krzysztof Juszkiewicz (juszkiew@kt.agh.edu.pl) wrote:
: Napisalem sobie funkcje gdzie bylo:
: fn {
: local @array;
: push @array, $costam
: ...
: }
: Czy istnieje jakis sposob, zeby tego uniknac inny niz napisanie wprost
: @array=();
Tak naprawde tobie chodzilo o my(), a nie local(). Sprobuj.
pozdrowienia
Piotr Budrewicz
Re: Lokalnosc wektorow
Author: Piotr Manturzyk
Date: Wed, 10 Dec 1997 12:40
Date: Wed, 10 Dec 1997 12:40
8 lines
807 bytes
807 bytes
Krzysztof Juszkiewicz wrote: > Czy istnieje jakis sposob, zeby tego uniknac inny niz napisanie wprost > @array=(); undef @array; gandalf -- can't find .sig :-(
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads