🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.perl
5 messages
5 total messages Started by Krzysztof Juszkiewicz Thu, 04 Dec 1997 11:13
Lokalnosc wektorow
#744
Author: Krzysztof Juszkiewicz
Date: Thu, 04 Dec 1997 11:13
20 lines
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
#745
Author: Michal Trojnara
Date: Thu, 04 Dec 1997 13:30
13 lines
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)
#746
Author: Piotr Piatkowski
Date: Thu, 04 Dec 1997 15:09
82 lines
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
#747
Author: Piotr Budrewicz
Date: Thu, 04 Dec 1997 16:51
15 lines
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
#749
Author: Piotr Manturzyk
Date: Wed, 10 Dec 1997 12:40
8 lines
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