Thread View: pl.comp.lang.perl
7 messages
7 total messages
Started by Slawek
Fri, 30 Oct 2009 14:01
Jak dobrać się do zmiennej
Author: Slawek
Date: Fri, 30 Oct 2009 14:01
Date: Fri, 30 Oct 2009 14:01
27 lines
1460 bytes
1460 bytes
Witam,
Skrypt jak poniżej.
Powiedzcie mi jak w funkcji test() mogę się dobrać do zmiennej $bb
Zmienna ta powstaje w pętli w głównym skrypcie i nie mam pomysłów
Oczywiście w żadnym wypadku zmienne nie mogą byc przekazywane jako parametry
po przez np &test($bb) ponieważ w moim programie za dużo jest takich
zmiennych.
Pewnie musi być coś a'la $main::bb ale się pogubiłem.
my $aa='aaaa';
#jakas petelka
{
my $bb='bbbb';
&test;
}
sub test
{
print "aa=$aa\n"; # wynik aa=aaaa wiec ok
print "bb=$bb\n"; # wynik bb= wiec zle
}
Pozdr.
Sławek
Re: Jak dobra? si? do zmiennej
Author: Stachu 'Dozzie' K.
Date: Fri, 30 Oct 2009 14:17
Date: Fri, 30 Oct 2009 14:17
22 lines
1763 bytes
1763 bytes
On 30.10.2009, Slawek wrote: > Skrypt jak poni?ej. A mógłbyś sobie sprawić czytnik news? Albo chociaż Outlook Expressa skonfigurować żeby nie psuł kodowania. > Powiedzcie mi jak w funkcji test() mog? si? dobra? do zmiennej $bb > Zmienna ta powstaje w p?tli w g?ównym skrypcie i nie mam pomys?ów > Oczywi?cie w ?adnym wypadku zmienne nie mog? byc przekazywane jako parametry > po przez np &test($bb) poniewa? w moim programie za du?o jest takich > zmiennych. Ty nie chcesz dobrać się do zmiennej $bb, tylko przeprojektować skrypt. Jeśli jedna funkcja zaczyna za dużo robić jako skutki uboczne (zmiana jakichś zmiennych globalnych, podmienianie deskryptorów plików), to momentalnie rosną trudności w debuggowaniu -- zwyczajnie zapominasz że funkcja jeszcze coś tam zmieniała. Myślisz że dlaczego tak ściga się za zmienne globalne? -- Stanislaw Klekot
Re: Jak dobrać się do zmiennej
Author: Slawek
Date: Fri, 30 Oct 2009 14:44
Date: Fri, 30 Oct 2009 14:44
22 lines
1886 bytes
1886 bytes
> A mógłbyś sobie sprawić czytnik news? Albo chociaż Outlook Expressa > skonfigurować żeby nie psuł kodowania. czy teraz lepiej? > Ty nie chcesz dobrać się do zmiennej $bb, tylko przeprojektować skrypt. > Jeśli jedna funkcja zaczyna za dużo robić jako skutki uboczne (zmiana > jakichś zmiennych globalnych, podmienianie deskryptorów plików), to > momentalnie rosną trudności w debuggowaniu -- zwyczajnie zapominasz że > funkcja jeszcze coś tam zmieniała. > Myślisz że dlaczego tak ściga się za zmienne globalne? nie chcę zmieniać zawartości zmiennych. chcę tylko zachować czytelność kodu i zamiast wciskać ileś linijek w główny skrypt to chciałem zrobić funkcję na końcu skryptu. Natomiast po zwróceniu uwagi miło by było zobaczyć także rozwiązanie np "ale jeśli już musisz iść tą drogą, to zrób tak ..." :) bo ja nadal nie mam pomysłu. Pozdr Sławek
Re: Jak dobrać się do zmiennej
Author: Stachu 'Dozzie' K.
Date: Fri, 30 Oct 2009 15:27
Date: Fri, 30 Oct 2009 15:27
27 lines
2052 bytes
2052 bytes
On 30.10.2009, Slawek wrote: >> A mógłbyś sobie sprawić czytnik news? Albo chociaż Outlook Expressa >> skonfigurować żeby nie psuł kodowania. > > czy teraz lepiej? Lepiej. Dziękuję. >> Ty nie chcesz dobrać się do zmiennej $bb, tylko przeprojektować skrypt. >> Jeśli jedna funkcja zaczyna za dużo robić jako skutki uboczne (zmiana >> jakichś zmiennych globalnych, podmienianie deskryptorów plików), to >> momentalnie rosną trudności w debuggowaniu -- zwyczajnie zapominasz że >> funkcja jeszcze coś tam zmieniała. >> Myślisz że dlaczego tak ściga się za zmienne globalne? > > nie chcę zmieniać zawartości zmiennych. > chcę tylko zachować czytelność kodu i zamiast wciskać ileś linijek w główny > skrypt > to chciałem zrobić funkcję na końcu skryptu. > Natomiast po zwróceniu uwagi miło by było zobaczyć także rozwiązanie > np "ale jeśli już musisz iść tą drogą, to zrób tak ..." :) W tym trick że nie musisz. Na pewno się da to zorganizować lepiej, choćby upakować zmienne do %hasza i podawać funkcji referencję do niego. -- Stanislaw Klekot
Re: Jak dobrać się do zmiennej
Author: Adam Osuchowski
Date: Fri, 30 Oct 2009 16:14
Date: Fri, 30 Oct 2009 16:14
34 lines
2814 bytes
2814 bytes
Slawek wrote:
> nie chcę zmieniać zawartości zmiennych.
> chcę tylko zachować czytelność kodu i zamiast wciskać ileś linijek w główny
> skrypt
> to chciałem zrobić funkcję na końcu skryptu.
> Natomiast po zwróceniu uwagi miło by było zobaczyć także rozwiązanie
> np "ale jeśli już musisz iść tą drogą, to zrób tak ..." :)
> bo ja nadal nie mam pomysłu.
Byłoby może i miło, ale w tej postaci, którą podałeś jest to niewykonalne,
a przynajmniej nie w sposób, który by znacząco nie zaciemnił kodu, więc
nie oczekuj cudów jeśli stawiasz takie ograniczenia. my() deklaruje
zmienną o zasięgu leksykalnym (prywatną), czyli taką, której widoczność
poprzez swoją nazwę jest ograniczona do najbardziej wewnętrznego bloku
wyznaczonego za pomocą { i }. Możesz się dostać do jej zawartości poza
tym blokiem, pod warunkiem, że będziesz miał w zasięgu zapamiętaną
referencję do tej zmiennej. Można też, ew. próbować cudawianek z evalem
albo preprocesingiem, ale to wyjdzie Ci z tego potworek rodem z golfa
albo IOCCC.
> Oczywiście w żadnym wypadku zmienne nie mogą byc przekazywane jako parametry
> po przez np &test($bb) ponieważ w moim programie za dużo jest takich
> zmiennych.
> Pewnie musi być coś a'la $main::bb ale się pogubiłem.
W tym sęk, że w ten sposób możesz się dostać do zmiennych pakietowych,
a nie do zmiennych prywatnych. Uważam, podobnie jak Dozzie, że spokojnie
dałoby się to przepisać w takiej postaci, aby było czytelne (i nie
wykluczone, że czytelniejsze niż masz to teraz) i jednocześnie spełniało
swoje zadanie bez takiej kombinatoryki. Swoją drogą, skoro chcesz się
dostawać do zmiennych spoza swojego zasięgu, to po co je tam deklarowałeś
jak prywatne? Zmienne do których powinien mieć dostęp cały kod to zmienne
globalne, a reszta jest prywatna, ew. przekazywana przez parametry wywołań
funkcji.
Re: Jak dobrać się do zmiennej
Author: Kacper Perschke
Date: Sat, 31 Oct 2009 18:48
Date: Sat, 31 Oct 2009 18:48
21 lines
1735 bytes
1735 bytes
Dnia 30.10.2009 Stachu 'Dozzie' K. <dozzie@dynamit.im.pwr.wroc.pl.nospam> napisał:
> [...]
> W tym trick że nie musisz. Na pewno się da to zorganizować lepiej,
> choćby upakować zmienne do %hasza i podawać funkcji referencję do niego.
I takie zachowanie zaleca się kiedy lista argumentów zaczyna przekraczać 5-6.
Zresztą nie musi być przekazywany przez referencję.
------------------------------------------------------------------------
use strict;
my %haszcz_01 = (Stachu => 'Dozzie', ja => 'to ja');
funkcyja(%haszcz_01);
sub funkcyja {
my %haszcz_02 = @_;
use Data::Dumper;
print Data::Dumper->Dump([\%haszcz_02], ['haszcz_02']);
}
------------------------------------------------------------------------
KAcper
Re: Jak dobrać się do zmiennej
Author: stas53
Date: Sat, 31 Oct 2009 22:04
Date: Sat, 31 Oct 2009 22:04
59 lines
3074 bytes
3074 bytes
On 31 Paź, 19:48, Kacper Perschke <zbp.yv...@rxupferc.ercpnx> wrote:
> Dnia 30.10.2009 Stachu 'Dozzie' K. <doz...@dynamit.im.pwr.wroc.pl.nospam> napisał:
>
> > [...]
> > W tym trick że nie musisz. Na pewno się da to zorganizować lepiej,
> > choćby upakować zmienne do %hasza i podawać funkcji referencję do niego.
>
> I takie zachowanie zaleca się kiedy lista argumentów zaczyna przekraczać 5-6.
> Zresztą nie musi być przekazywany przez referencję.
> ------------------------------------------------------------------------
> use strict;
>
> my %haszcz_01 = (Stachu => 'Dozzie', ja => 'to ja');
> funkcyja(%haszcz_01);
>
> sub funkcyja {
> my %haszcz_02 = @_;
> use Data::Dumper;
> print Data::Dumper->Dump([\%haszcz_02], ['haszcz_02']);}
>
> ------------------------------------------------------------------------
>
> KAcper
Cześć,
1/ Kilku kolegów już napisało, że pomysł nie-przekazywania parametru
przez listę jest podejrzany. Więc ja dam spokój.
2/ Kluczowym problemem w Twoim skrypcie jest zestawienie w pętli
instrukcji
my $bb='bbbb';
&test;
Tak zdefiniowane $bb nie ma sposobu przeniknąć do 'test' bo jest w
innej przestrzeni leksykalnej. Nie wiem czemu tu 'my'.
3/ Możesz użyć 'our' (zmiennej globalnej)
4/ Oto działąjący przykład
use strict;
my $aa='aaaa';
our $bb_ext;
#jakas petelka
for (my $i = 3; $i < 8; $i+=2)
{
$bb_ext=$i;
&test;
}
sub test
{
print "aa=$aa\n"; # wynik aa=aaaa wiec ok
print "bb=$main::bb_ext\n"; # wynik bb= wiec
zle
}
Pzdr,
Staś
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