🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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)
#841
Author: Waldek Grudzien
Date: Mon, 29 Dec 1997 07:22
38 lines
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)
#842
Author: Jacek Ablewicz
Date: Mon, 29 Dec 1997 12:40
30 lines
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)
#844
Author: Piotr Piatkowski
Date: Mon, 29 Dec 1997 17:56
65 lines
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)
#843
Author: Waldek Grudzien
Date: Tue, 30 Dec 1997 06:56
18 lines
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)
#846
Author: Waldek Grudzien
Date: Mon, 05 Jan 1998 12:47
35 lines
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)
#847
Author: Piotr Piatkowski
Date: Mon, 05 Jan 1998 15:21
37 lines
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)
#848
Author: Waldek Grudzien
Date: Tue, 06 Jan 1998 06:59
30 lines
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)
#845
Author: Marcin Laszewski
Date: Tue, 06 Jan 1998 09:42
4 lines
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