DBI-Objektinstanz an Modul übergeben

DBI-Objektinstanz an Modul übergeben

am 07.08.2006 03:40:42 von Thomas Skora

Hallo alle zusammen!

In einem Projekt an dem ich derzeit arbeite trat folgende Situation ein:
es existiert ein Modul BlaXML::Task, welches per DBI
Datenbankoperationen ausführen soll. Das DBI-Objekt wurde in main::
erstellt.

Um DB-Operationen auszuführen greif ich einfach auf den main-Namespace
zurück, was nicht sonderlich elegant ist. Lieber wäre es mir, wenn ich
das DBI-Objekt an BlaXML::Task übergeben würde.

BlaXML::Task->init($dbh) und paar andere Variationen machen nicht das,
was ich mir erhofft hab. Und das überfliegen diverser Perldocs brachte
auch keine Erleuchtung.

Wie mach ich sowas am elegantesten? $::dbh->do(...) tuts hier zwar
hervorragend, ich wäre einem sauberen Stil dennoch nicht abgeneigt ;-)

Re: DBI-Objektinstanz an Modul übergeben

am 07.08.2006 13:25:56 von Reinhard Pagitsch

Hallo Thomas,

Thomas Skora wrote:
> Hallo alle zusammen!
>
> In einem Projekt an dem ich derzeit arbeite trat folgende Situation ein:
> es existiert ein Modul BlaXML::Task, welches per DBI
> Datenbankoperationen ausführen soll. Das DBI-Objekt wurde in main::
> erstellt.
>
> Um DB-Operationen auszuführen greif ich einfach auf den main-Namespace
> zurück, was nicht sonderlich elegant ist. Lieber wäre es mir, wenn ich
> das DBI-Objekt an BlaXML::Task übergeben würde.
>
> BlaXML::Task->init($dbh) und paar andere Variationen machen nicht das,
> was ich mir erhofft hab. Und das überfliegen diverser Perldocs brachte
> auch keine Erleuchtung.

Warum sollte das nicht gehen? Wie sieht der Code des Modules aus? Ich
habe bei solchen Konstrukten eigentlich kein Problem.

sub init
{
my $dbh = shift;
......
}

Das sollte doch eigentlich funktionieren?

regards,
Reinhard

--
PM replays nur an reinhard dot pagitsch at isis-papyrus dot com.
Die Adresse im From/Replay To wird nicht gelesen.

Re: DBI-Objektinstanz an Modul übergeben

am 07.08.2006 14:24:38 von Thomas Skora

Reinhard Pagitsch wrote:

> Warum sollte das nicht gehen? Wie sieht der Code des Modules aus?

Modul (BlaXML/Task.pm):
package BlaXML::Task;

sub init {
$dbh = shift;
}
[...]

Hauptprogramm (index.cgi):
[...]
BlaXML::Task->init($dbh);
[...]

> Ich habe bei solchen Konstrukten eigentlich kein Problem.
>
> sub init
> {
> my $dbh = shift;
> ......
> }
>
> Das sollte doch eigentlich funktionieren?


Dachte ich auch...$dbh funktioniert im Namespace main:: einwandfrei.
Wenn ich es da mit print ausgebe ist es auch ein Hash=DBI. In
BlaXML::Task dagegen gibt print auch BlaXML::Task aus.

Thomas

Re: DBI-Objektinstanz an Modul übergeben

am 07.08.2006 21:17:30 von Maluku

Reinhard Pagitsch schrieb:
> Thomas Skora wrote:
>>BlaXML::Task->init($dbh)
>
> sub init
> {
> my $dbh = shift;
> ......
> }
>
> Das sollte doch eigentlich funktionieren?

Nein.

sub init {
my $class=shift;
my $dbh=shift;
}

wobei $class dann "BlaXML::Task" ist wenn init über
BlaXML::Task->init($dbh) aufgerufen wird.



--
$_='';s%%`^.*`s;.*;uhtnmo;;a>lha~a>inu~a>fmk~a>rou~a>duM~a>b tl~s;&&&&&&;
!d1!l2!b3!i4!f5!r6q(?);e;Z``}a>&&&`sub# "1#{#"_=shift#;s^"2^"3#^;``;~`
return #"_#}``^!&&`"1(#""2)#\.`Z%x;s~Z~print~g;s/#/\\/g;
s/`(.)(.+?)`(.+?)`/s$1$2$1$3$1g\;/gsx;s;&;(.);g;y^"^$^;print ;

Re: DBI-Objektinstanz an Modul übergeben

am 07.08.2006 21:40:00 von hjp-usenet2

On Mon, 07 Aug 2006 14:24:38 +0200, Thomas Skora wrote:
> Modul (BlaXML/Task.pm):
> package BlaXML::Task;
>
> sub init {
> $dbh = shift;
> }
> [...]
>
> Hauptprogramm (index.cgi):
> [...]
> BlaXML::Task->init($dbh);
> [...]
>
>> Ich habe bei solchen Konstrukten eigentlich kein Problem.
>>
>> sub init
>> {
>> my $dbh = shift;
>> ......
>> }
>>
>> Das sollte doch eigentlich funktionieren?
>
>
> Dachte ich auch...$dbh funktioniert im Namespace main:: einwandfrei.
> Wenn ich es da mit print ausgebe ist es auch ein Hash=DBI. In
> BlaXML::Task dagegen gibt print auch BlaXML::Task aus.

Du solltest perltoot lesen. Du rufst hier init als Klassen-Methode auf, und
da wird die Klasse als erstes Argument übergeben.

sub init {
my ($class, $dbh) = @_;

...

}

Wenn Du init einfach als Subroutine aufrufen willst, dann musst Du es
mit BlaXML::Task::init($dbh) aufrufen.

hp


--
_ | Peter J. Holzer | > Wieso sollte man etwas erfinden was nicht
|_|_) | Sysadmin WSR | > ist?
| | | hjp@hjp.at | Was sonst wäre der Sinn des Erfindens?
__/ | http://www.hjp.at/ | -- P. Einstein u. V. Gringmuth in desd

Re: DBI-Objektinstanz an Modul übergeben

am 08.08.2006 08:42:55 von Reinhard Pagitsch

Marc Lucksch wrote:
> Reinhard Pagitsch schrieb:
>> Thomas Skora wrote:
>>
>> Das sollte doch eigentlich funktionieren?
>
> Nein.
>
> sub init {
> my $class=shift;
> my $dbh=shift;
> }

Da hast du natürlich recht.

regards,
Reinhard

--
PM replays nur an reinhard dot pagitsch at isis-papyrus dot com.
Die Adresse im From/Replay To wird nicht gelesen.

Re: DBI-Objektinstanz an Modul übergeben

am 08.08.2006 09:42:07 von Thomas Skora

Peter J. Holzer wrote:

> Du solltest perltoot lesen. Du rufst hier init als Klassen-Methode auf, und
> da wird die Klasse als erstes Argument übergeben.

Argh! Da war doch was ;-)

Danke für den Hinweis!

Thomas