[Perl] Hash vanuit andere file importeren

Pagina: 1
Acties:

  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 14-08 15:59
Heb in config.pm hetvolgende:
Perl:
1
2
3
4
5
6
7
8
9
10
use strict;
use vars qw(%config);

my %config;
%config = (
    "db_host"   =>  "localhost",
    "db_user"   =>  "blablabla"
    );

1;


Nou doe ik in autoexec.pl hetvolgende:
Perl:
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl
# autoexec.pl
#  - Auto executes lots of things (also includes every config file)

use strict;
use DBI;
use lib (".");

require config;

print $config{'db_host'};

Deze code had ik na een aanzetje van http://www.aota.net/forums/showthread.php?threadid=13377 . Maar werken wil het niet:
code:
1
2
Global symbol "%config" requires explicit package name at ./autoexec.pl line 11.
Execution of ./autoexec.pl aborted due the compilation errors.

Kijk, als je de stricts weghaald werkt het gewoon. Maar mijn vraag is dus, is het wel mogelijk als je de stricts gewoon laat staan?

[ Voor 14% gewijzigd door zeroxcool op 14-03-2003 15:35 ]

zeroxcool.net - curity.eu


  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 14-08 15:59
Een schopje.

zeroxcool.net - curity.eu


Verwijderd

probeer deze es in autoexec.pl:

code:
1
use vars qw( %config );

  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 14-08 15:59
Ik moet het anders zeggen, de error is nu weg, alleen %config bevat geen enkele waarde meer in autoexec.pl.

[ Voor 67% gewijzigd door zeroxcool op 14-03-2003 12:08 ]

zeroxcool.net - curity.eu


Verwijderd

use vars is obsolete, moet het niet zijn:

Perl:
1
2
3
4
5
6
7
8
9
use strict;

our %config;
%config = (
    "db_host"    =>    "localhost",
    "db_user"    =>    "blablabla"
    );

1;


Anders blijft ie namelijk in de scope zitten van die eerste class, tenzij je de hash exporteert, of tenzij je $config::config{'db_host'}; gebruikt... Ik heb het nie getest maar de foutmelding impliceert dat de hash in main niet bestaat...

edit:
Ik zou het bestand overigens een .pl extensie geven ipv .pm, die laatste is namelijk voorbehouden aan packages (perl modules), deze vereisen bovenaan een package name... Dus voor "require" .pl en voor "use" .pm.

[ Voor 47% gewijzigd door Verwijderd op 14-03-2003 21:08 ]


  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 14-08 15:59
Heb dus even gedaan wat je zei, ik heb dus in autoexec.pl de use vars weggehaald (evenals in config.pl). Maar nog steeds kent hij %config niet. Zal ik dan toch maar een package van config moeten maken? ($config::mysql('db_host') oid)?

zeroxcool.net - curity.eu


  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 14-08 15:59
Heb het nu dus door middel van packages opgelost. De code nu dus:
autoexec.pl:
Perl:
1
2
3
4
5
6
7
8
9
10
11
12
13
# autoexec.pl
#  - Auto executes lots of things (also includes every config file)

use strict;
use DBI;
use lib (".");

package mysql;

require "config.pl";

my $connectstring = "DBI:mysql:database=$config::mysql{'db_name'};host=$config::mysql{'db_host'};port=$config::mysql{'db_port'}";
$mysql::connection = DBI->connect($connectstring, $config::mysql{'db_user'}, $config::mysql{'db_pass'});
Nb: hier is meteen een mysql package gemaakt, voor gebruik in andere files.

En config.pl:
Perl:
1
2
3
4
5
6
7
8
9
10
11
12
use strict;

package config;

%config::mysql = (
    "db_host"   =>  "localhost",
    "db_name"   =>  "vhostmanager",
    "db_user"   =>  "vhostmanager",
    "db_pass"   =>  "jeweetwelman"
    );

1;

Werkt als een trein :P.

Bedankt voor de tips guys!

[ Voor 16% gewijzigd door zeroxcool op 14-03-2003 22:20 ]

zeroxcool.net - curity.eu


Verwijderd

Ik ben "vergeten" te vertellen dat je de hash dan ook in het andere bestand moet declareren met "our". Dus:

Perl:
1
2
3
4
5
6
7
8
9
10
# config.pl

use strict;

our %config = (
    db_host    =>    "localhost",
    db_user    =>    "blablabla"
    );

1;


Perl:
1
2
3
4
5
6
7
8
9
# autoexec.pl

use strict;

require "config.pl";

our %config;

print STDOUT $config{"db_host"};


Wat natuurlijk vrij logisch omdat Perl anders meldingen geeft van ongeinitialiseerde variabelen (omdat je strict gebruikt)... Wat jij gedaan hebt werkt. Maar tis wel een beetje overdreven :)

[ Voor 7% gewijzigd door Verwijderd op 15-03-2003 00:41 ]


  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 14-08 15:59
Dat klopt, nouja, net te laat om het weer in iedere file aan te gaan passen, maar goed, dit werkt ook, hoe omslachtig het ook is :P.

zeroxcool.net - curity.eu

Pagina: 1