🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.perl
Article #746

Re: Lokalnosc wektorow (OWWNKCW na temat local i my)

#746
From: 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
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-mail
References: <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