🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: Dziedziczenie obiektów (moduły w PERL'u)

#844
From: 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
Technical Details
Message-ID: <688o8g$lc6$1@galaxy.uci.agh.edu.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!lublin.pl!news.onet.pl!agh.edu.pl!agh.edu.pl!not-for-mail
References: <Pine.HPP.3.96.971229075637.10451B-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!lublin.pl!news.onet.pl!agh.edu.pl!agh.edu.pl!not-for-mail
From: Piotr Piatkowski <kompas@galaxy.uci.agh.edu.pl>
Newsgroups: pl.comp.lang.perl
Subject: Re: Dziedziczenie obiektów (moduły w PERL'u)
Date: 29 Dec 1997 18:56:32 +0100
Organization: University of Mining & Metallurgy
Lines: 65
Message-ID: <688o8g$lc6$1@galaxy.uci.agh.edu.pl>
References: <Pine.HPP.3.96.971229075637.10451B-100000@clinicom.uhc.lublin.pl>
NNTP-Posting-Host: galaxy.uci.agh.edu.pl
Mime-Version: 1.0
X-Newsreader: TIN [UNIX 1.3 unoff BETA 971018; sun4m SunOS 5.5.1]
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit