🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: use sctrict i deklaracja my - rozwiązanie problemu

#862
From: Michał Mosiewicz
Date: Fri, 09 Jan 1998 14:39
96 lines
3988 bytes
Waldek Grudzien wrote:
> 
> On Thu, 8 Jan 1998, Michał Mosiewicz wrote:
> 
> > Waldek Grudzien wrote:
> >
> > > No dobrze, ale może ja nie chcę, żeby zmienne (powiedzmy robocze), które
> > > wykorzystuję (deklaruję) w "części głównej programu" były widoczne w
> > > funkcjach (chyba, że jawnie zadeklaruję je jako globalne używając
> > > 'use vars qw(#tu lista moich zmiennych globalnych#)' )
> > > Uff - chyba naświetliłem już wystarczająco ;-) ?
> >
> > Hmm, ja bym powiedział, że to jest lekko nienaturalne. Zazwyczaj
> > większość języków programowania posługuje się pojęciem zasięgu
> > zmiennych. I chyba nie istnieje język który pozwala usuwać widoczność
> > zmiennych przy zagnieżdżaniu. (OK, nie mówmy o prywatnych elementach
> > obiektów)
> 
> No nie, bez przesady - za chwilę dowiem się, że przykładowo w języku C
> zmienne zadeklarowane w main {} są widoczne w innych funkcjach ...

Przecież w perlu TEŻ NIE SĄ widoczne:

#!/usr/bin/perl

&main();

sub test {
  print "\$c in test: $c\n";
}

sub main {
 my $c = "defined\n";
 &test();
 print "\$c in main: $c\n";
}  

bash$ perl test
$c in test:
$c in main: defined
                
Widać wyraźnie, że lokalna definicja funkcji $c zdeklarowanej w funkcji
main jest jak najbardziej niewidoczna w innych funkcjach.

Natomiast ja byłem przekonany, że chodzi Ci o jakiś mechanizm
przesłaniania zmiennych w zagnieżdżonych blokach. Bo w przypadku o
którym piszesz, każda funkcja była zagnieżdżona w głównym kodzie
programu. I dlatego uzyskiwała dostęp do wszystkich zmiennych które w
tym kodzie były wstawione.

Jeśli dla Ciebie "główna część programu" to po prostu funkcja main, to
nic nie stoi na przeszkodzie, żeby ją sobie napisać. Natomiast jeśli
chodzi o kod funkcji umieszczonych w ciele głównego programu, to należy
pamiętać, że w perlu cały program jest jedną dużą funkcją, w której
wszystkie inne są zagnieżdżone. I te, które są w niej zagnieżdżone
uzyskują dostęp do jej komponentów. Żeby to lepiej przedstawić to inny
przykład:

#!/usr/bin/perl

&main();

sub test {
  print "\$c in test: $c\n";
}

sub main {
 my $c = "\$c\n";
 &test();
 print "\$c in main: $c\n";
 &test1();

sub test1 {
  print "\$c in test1: $c\n";
}

}     

Jak łatwo się domyśleć wynik działania tego programu będzie następujący:

bash$ perl test
$c in test:
$c in main: defined

$c in test1: defined


Funkcja test1 jest zagnieżdżona w ciele funkcji main i dlatego uzyskuje
dostęp do zmiennych w niej zdeklarowanych. Funkcja test, która jest poza
main, tego dostępu już nie ma.

Michał
                       
-- 
WWW: http://www.lodz.pdi.net/~mimo  tel: Int. Acc. Code + 48 42 148340
add: Michal Mosiewicz  *  Bugaj 66 m.54 *  95-200 Pabianice  *  POLAND
Technical Details
Message-ID: <34B636B4.529EA50D@lodz.pdi.net>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!uw.edu.pl!mimo.lodz.pdi.net!not-for-mail
References: <Pine.HPP.3.96.980106080208.22789B-100000@clinicom.uhc.lublin.pl> <68t9l8$odv$1@galaxy.uci.agh.edu.pl> <Pine.HPP.3.96.980106145512.25699A-100000@clinicom.uhc.lublin.pl> <68tejj$8f2$1@galaxy.uci.agh.edu.pl> <Pine.HPP.3.96.980107101037.29387A-100000@clinicom.uhc.lublin.pl> <6907db$dkd$1@galaxy.uci.agh.edu.pl> <Pine.HPP.3.96.980108073610.3985B-100000@clinicom.uhc.lublin.pl> <34B4DF4C.1ADEFC@lodz.pdi.net> <Pine.HPP.3.96.980109074808.8390A-100000@clinicom.uhc.lublin.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!uw.edu.pl!mimo.lodz.pdi.net!not-for-mail
From: Michał Mosiewicz <mimo@lodz.pdi.net>
Newsgroups: pl.comp.lang.perl
Subject: Re: use sctrict i deklaracja my - rozwiązanie
 problemu
Date: Fri, 09 Jan 1998 14:39:48 +0000
Organization: (none)
Lines: 96
Message-ID: <34B636B4.529EA50D@lodz.pdi.net>
References: <Pine.HPP.3.96.980106080208.22789B-100000@clinicom.uhc.lublin.pl> <68t9l8$odv$1@galaxy.uci.agh.edu.pl> <Pine.HPP.3.96.980106145512.25699A-100000@clinicom.uhc.lublin.pl> <68tejj$8f2$1@galaxy.uci.agh.edu.pl> <Pine.HPP.3.96.980107101037.29387A-100000@clinicom.uhc.lublin.pl> <6907db$dkd$1@galaxy.uci.agh.edu.pl> <Pine.HPP.3.96.980108073610.3985B-100000@clinicom.uhc.lublin.pl> <34B4DF4C.1ADEFC@lodz.pdi.net> <Pine.HPP.3.96.980109074808.8390A-100000@clinicom.uhc.lublin.pl>
NNTP-Posting-Host: mimo.lodz.pdi.net
Mime-Version: 1.0
X-Mailer: Mozilla 4.04 [en] (X11; I; Linux 2.0.33 i586)
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit