Thread View: pl.comp.lang.perl
8 messages
8 total messages
Started by Waldek Grudzien
Mon, 29 Dec 1997 07:22
Dziedziczenie obiektów (moduły w PERL'u)
Author: Waldek Grudzien
Date: Mon, 29 Dec 1997 07:22
Date: Mon, 29 Dec 1997 07:22
38 lines
1822 bytes
1822 bytes
Mam następujący kłopot :
Próbuję napisać moduł, który dziedziczyłby metody z innego modułu
(obiektu). Treść modułu wygląda następująco :
-------------------------------
package DBR;
use Pg;
use strict;
@ISA = qw(Pg);
[dalej treść ...]
-------------------------------
Po próbie uruchomienia skryptu z wykorzystaniem tego modułu
(komenda use DBR; (oczywiście w linii 4)) wyskakuje komunikat :
-------------------------------
Global symbol "ISA" requires explicit
package name at DBR.pm line 5.
Compilation failed in require at ./t.pl line 4.
BEGIN failed--compilation aborted at ./t.pl line 4.
-------------------------------
Dla uspokojenia dodam, że tablica @INC zawiera ścieżkę dostępu do modułu
Pg, oraz, że po usunięciu linii "@ISA = qw(Pg);" wszystko działa
OK (z tym, że nie ma dziedziczenia ...)
Jeśli ktoś zna rozwiązanie tego problemu bardzo prosiłbym o radę.
Pozdrawiam i przy okazji życzę wszystkim happy NY.
Waldek Grudzień
///////////////////////////////////////////
// http://www.uhc.lublin.pl/~waldekg/ //
// Lublin/Lubartów, Poland //
\\ University Health Care \\
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Re: Dziedziczenie obiektów (moduły w PERL'u)
Author: Jacek Ablewicz
Date: Mon, 29 Dec 1997 12:40
Date: Mon, 29 Dec 1997 12:40
30 lines
1690 bytes
1690 bytes
In pl.comp.lang.perl Waldek Grudzien <waldekg@uhc.lublin.pl> wrote: : Mam następujący kłopot : : Próbuję napisać moduł, który dziedziczyłby metody z innego modułu : (obiektu). Treść modułu wygląda następująco : : ------------------------------- : package DBR; : use Pg; : use strict; : @ISA = qw(Pg); : [dalej treść ...] : ------------------------------- : Po próbie uruchomienia skryptu z wykorzystaniem tego modułu : (komenda use DBR; (oczywiście w linii 4)) wyskakuje komunikat : : ------------------------------- : Global symbol "ISA" requires explicit : package name at DBR.pm line 5. : Compilation failed in require at ./t.pl line 4. : BEGIN failed--compilation aborted at ./t.pl line 4. : ------------------------------- Kłopot chyba w "use strict", jeśli tak (czy te same objawy daje perl -w DBM.pm ?) to powinno pomóc np. "no strict 'vars'", albo lepiej "use vars qw( @ISA )". -- Jacek A.
Re: Dziedziczenie obiektów (moduły w PERL'u)
Author: Piotr Piatkowski
Date: Mon, 29 Dec 1997 17:56
Date: Mon, 29 Dec 1997 17:56
65 lines
2852 bytes
2852 bytes
Waldek Grudzien <waldekg@uhc.lublin.pl> wrote: : Mam następujący kłopot : : Próbuję napisać moduł, który dziedziczyłby metody z innego modułu : (obiektu). Treść modułu wygląda następująco : : ------------------------------- : package DBR; : use Pg; : use strict; ^^^^^^^^^^^^^ Dlaczego używasz słów których nie rozumiesz? :-) : @ISA = qw(Pg); : [dalej treść ...] : ------------------------------- : Po próbie uruchomienia skryptu z wykorzystaniem tego modułu : (komenda use DBR; (oczywiście w linii 4)) wyskakuje komunikat : : ------------------------------- : Global symbol "ISA" requires explicit : package name at DBR.pm line 5. : Compilation failed in require at ./t.pl line 4. : BEGIN failed--compilation aborted at ./t.pl line 4. : ------------------------------- No właśnie. use strict, włącza bardziej restrykcyjny tryb sprawdzania poprawności składniowej skryptu, który co prawda początkowo może sprawiać wiele problemów, ale za to doskonale ułatwia wykrywanie błędów (np. literówek w nazwach zmiennych) już na etapie kompilacji. Jednym z ograniczeń jakie wprowadza use strict, jest zakaz używania zmiennych globalnych, z wyjątkiem dwóch sytuacji - gdy taka zmienna jest zadeklarowana przez dyrektywę "use vars", lub gdy użyjemy pełnej nazwy (wraz z nazwą pakietu). Czyli można Twój problem rozwiązać na dwa sposoby: package DBR; use Pg; use strict; use vars qw(@ISA); @ISA = qw(Pg); ...albo: package DBR; use Pg; use strict @DBR::ISA = qw(Pg); powszechnie przyjęło się stosować tą pierwszą metodę, chociaż ja tam wolę tą drugą - kwestia smaku :-) Oczywiście można też po prostu wyrzucić "use strict", ale polecam przyzwyczaić się do tej dyrektywy - naprawdę często pozwala na szybkie wykrycie głupich błędów. Acha - przy ustawieniu "use strict" wszystkie zmienne które nie muszą być globalne (bo @ISA globalna być musi) należy deklarować przez my (np. my $x; albo my($x,$y,$z) ). -- Piotr Piątkowski, Uczelniane Centrum Informatyki, AGH Krakow, POLAND
Re: Dziedziczenie obiektów (moduły w PERL'u)
Author: Waldek Grudzien
Date: Tue, 30 Dec 1997 06:56
Date: Tue, 30 Dec 1997 06:56
18 lines
1343 bytes
1343 bytes
Dziękuję za odpowiedzi - pomogło faktycznie dodanie "use vars qw(@ISA);"
> : use strict;
> ^^^^^^^^^^^^^
> Dlaczego używasz słów których nie rozumiesz? :-)
No cóż - człowiek błądzi jeszcze po omacku...
Pozdrawiam i życzę raz jeszcze wszystkim udanego Sylwestra oraz Happy NY.
Waldek Grudzień
///////////////////////////////////////////
// http://www.uhc.lublin.pl/~waldekg/ //
// Lublin/Lubartów, Poland //
\\ University Health Care \\
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Re: Dziedziczenie obiektów (moduły w PERL'u)
Author: Waldek Grudzien
Date: Mon, 05 Jan 1998 12:47
Date: Mon, 05 Jan 1998 12:47
35 lines
2108 bytes
2108 bytes
> No właśnie. use strict, włącza bardziej restrykcyjny tryb sprawdzania
> poprawności składniowej skryptu, który co prawda początkowo może
> sprawiać wiele problemów, ale za to doskonale ułatwia wykrywanie
> błędów (np. literówek w nazwach zmiennych) już na etapie kompilacji.
>
> Jednym z ograniczeń jakie wprowadza use strict, jest zakaz używania
> zmiennych globalnych, z wyjątkiem dwóch sytuacji - gdy taka zmienna
> jest zadeklarowana przez dyrektywę "use vars", lub gdy użyjemy pełnej
> nazwy (wraz z nazwą pakietu).
No dobrze, ale czy można jakoś zmusić perl'a do działania tego mechanizmu
również na skalarach ?
Przykładowo mamy skrypt :
#!/usr/bin/perl
use strict;
my @b=(" "," \t ");
print "\n",@b,"\n";
print $a,",",$^O;
Uruchomienie nie powoduje żadnego komunikatu błędu (mimo, że $a nie jest
zadeklarowane w ogóle). Jeśli natomiast @b nie będzie miało deklaracji my
- to owszem perl wypluje :
Global symbol "b" requires explicit package name at ./10.pl line 3.
Pozdrawiam,
Waldek Grudzień
///////////////////////////////////////////
// http://www.uhc.lublin.pl/~waldekg/ //
// Lublin/Lubartów, Poland //
\\ University Health Care \\
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Re: Dziedziczenie obiektów (moduły w PERL'u)
Author: Piotr Piatkowski
Date: Mon, 05 Jan 1998 15:21
Date: Mon, 05 Jan 1998 15:21
37 lines
2031 bytes
2031 bytes
Waldek Grudzien <waldekg@uhc.lublin.pl> wrote:
:> Jednym z ograniczeń jakie wprowadza use strict, jest zakaz używania
:> zmiennych globalnych, z wyjątkiem dwóch sytuacji - gdy taka zmienna
:> jest zadeklarowana przez dyrektywę "use vars", lub gdy użyjemy pełnej
:> nazwy (wraz z nazwą pakietu).
: No dobrze, ale czy można jakoś zmusić perl'a do działania tego mechanizmu
: również na skalarach ?
: Przykładowo mamy skrypt :
: #!/usr/bin/perl
: use strict;
: my @b=(" "," \t ");
: print "\n",@b,"\n";
: print $a,",",$^O;
: Uruchomienie nie powoduje żadnego komunikatu błędu (mimo, że $a nie jest
: zadeklarowane w ogóle).
Ha, śmieszne :-)
Już wiem - co chodzi, perl się tak zachowuje wyłącznie dla zmiennych
$a i $b - dla wszystkich innych zgłasza błąd:
Global symbol "c" requires explicit package name at ./zz line 12.
Jak przypuszczam, wynika to z tego że zmienne te są traktowane nieco
specjalnie, a mianowicie w funkcji sort wskazują na elementy do
porównania:
sort { $a <=> $b } @list;
Wniosek - nie używać zmiennych $a i $b :-)
--
Piotr Piątkowski, Uczelniane Centrum Informatyki, AGH Krakow, POLAND
Re: Dziedziczenie obiektów (moduły w PERL'u)
Author: Waldek Grudzien
Date: Tue, 06 Jan 1998 06:59
Date: Tue, 06 Jan 1998 06:59
30 lines
1786 bytes
1786 bytes
On 5 Jan 1998, Piotr Piatkowski wrote:
> : No dobrze, ale czy można jakoś zmusić perl'a do działania tego mechanizmu
> : również na skalarach ?
> : Przykładowo mamy skrypt :
>
> : #!/usr/bin/perl
> : use strict;
> : my @b=(" "," \t ");
> : print "\n",@b,"\n";
> : print $a,",",$^O;
>
> : Uruchomienie nie powoduje żadnego komunikatu błędu (mimo, że $a nie jest
> : zadeklarowane w ogóle).
>
> Ha, śmieszne :-)
>
> Już wiem - co chodzi, perl się tak zachowuje wyłącznie dla zmiennych
> $a i $b - dla wszystkich innych zgłasza błąd:
Śmieszne, ale niestety mało intuicyjne 8-) ...
Pozdrawiam,
Waldek Grudzień
///////////////////////////////////////////
// http://www.uhc.lublin.pl/~waldekg/ //
// Lublin/Lubartów, Poland //
\\ University Health Care \\
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Re: Dziedziczenie obiektów (moduły w PERL'u)
Author: Marcin Laszewski
Date: Tue, 06 Jan 1998 09:42
Date: Tue, 06 Jan 1998 09:42
4 lines
846 bytes
846 bytes
Waldek Grudzien (waldekg@uhc.lublin.pl) wrote: : Pozdrawiam i =BFycz=EA raz jeszcze wszystkim udanego Sylwestra oraz Happy N= A dziekuje!
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