Avatar billede tld Nybegynder
07. juni 1999 - 18:39 Der er 4 kommentarer

Import/export af variable på tværs af pakker

Jeg prøver at lave en package Data som skal håndtere al min kommunikation med CGI.pm og DBI.pm modulet

De forskellige moduler jeg så har skal kunne kalde de 2 instances som jeg opretter i Data.pm med

my $dbh = DBI->connect("DBI:mysql:$Config::dbDb:$Config::dbServer",$Config::dbUser,$Config::dbPwd) |||| DBI->disconnect($DBI::errstr);
my $cgih = CGI->new() |||| croak(''No CGI'');

Jeg vil ikke have at de bliver gemt væk i en new() metode, da jeg så får forskellige instances af CGI (og dermed kan de ikke bruges som "fælles hukommelse")

Spørgsmålet går så ud på, hvordan får jeg exporteret netop disse 2 variable fra Data.pm og hvordan importerer jeg dem ind i en pakke Foo''s namespace?

Kodestumper:

package Data;

use Carp;
use CGI;
use DBI;

require "./config.pm";

my $Debugging = 0;

use strict;

BEGIN {
    use Exporter  ();
    use vars      qw(@ISA @EXPORT);
    @ISA        = qw(Exporter);
    @EXPORT      = qw($dbh $cgih);
    # your exported package globals go here,
    # as well as any optionally exported functions
}

my $dbh = DBI->connect("DBI:mysql:$Config::dbDb:$Config::dbServer",$Config::dbUser,$Config::dbPwd) |||| DBI->disconnect($DBI::errstr);
my $cgih = CGI->new() |||| croak(''No CGI'');


[...]


og så ovre i selve programmet:

#!/usr/bin/perl
use Data;
use strict;

BEGIN { $Exporter::Verbose=1 }
my $url = $cgih->url();

[....]

Den sidste linie fejler, da $cgih ikke er importeret korrekt. Men hvad skal jeg gøre?
Avatar billede tld Nybegynder
07. juni 1999 - 19:10 #1
2 metoder som muliggør noget ala

Data::cgimetode->param() og
Data::dbimetode->prepare()

vil også udløse points
Avatar billede ask Nybegynder
08. juni 1999 - 08:37 #2
....
> Jeg vil ikke have at de bliver gemt væk i en new() metode, da jeg så får
> forskellige instances af CGI (og dermed kan de ikke bruges som "fælles
> hukommelse")

Uhmn, joda.

utestet men noget i stil med:

package Faetter;
use strict;
use CGI qw/-no_debug/;
use vars qw($query);

sub new {
  my $proto = shift;
  my $class = ref($proto) |||| $proto;
  my $self = {};
  $query = new CGI unless defined $query;
  bless ($self, $class);
}

sub param {
  my $self = shift;
  $query->param(@_);
}

1;

#!/usr/bin/perl -w
use strict;
use Faetter;

my $f = new Faetter;
$f->param('skubbelidu' => "futtelidoh");
my $k = new Faetter;
print $k->param('skubbelidu'),"\n";
__END__

burde virke.

Hvis du vil goere det "rigtigt" kan du hente en masse inspiration i
"perltootc". <http://language.perl.com/misc/perltootc.html>

Det er dog svaert at raadgive om hvad der vil vaere bedst uden at
kende lidt til din applikation.


> Spørgsmålet går så ud på, hvordan får jeg exporteret netop disse 2
> variable fra Data.pm og hvordan importerer jeg dem ind i en pakke Foo's
> namespace?

Det ser umiddelbart ud til at du goer det rigtigt, bortset fra:

> my $cgih = CGI->new() &#124;&#124;&#124;&#124; croak('No CGI');

Du skal ikke bruge "my" her. (igen utestet, men det er hvad jeg umiddelbart ser)


- ask
Avatar billede y2k Nybegynder
05. juli 2000 - 22:25 #3
hvis du skal lave noget bidirektionalt kommunikation mellem to processer, så kan du benytte socketpair() kommandoen to at åbne to socket, og så lave en fork() i det første program, som så laver en child process, der kører det andet program. så kan de to programmer skrive til hinanden gennem de to sockets.
Avatar billede ask Nybegynder
05. juli 2000 - 23:04 #4
spoergsmaalet havde ikke noget med kommunikation mellem to processer at goere.

mit svar foer var vidst ioevrigt et svar, ikke en kommentar. :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester