Article View: pl.comp.lang.perl
Article #862Re: use sctrict i deklaracja my - rozwiązanie problemu
From: Michał Mosiewicz
Date: Fri, 09 Jan 1998 14:39
Date: Fri, 09 Jan 1998 14:39
96 lines
3988 bytes
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-mailReferences:
<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