net*_*djw 0 variables perl perl-module
有没有办法perl将变量从主脚本导入模块?
这是我的main.pl:
#!/usr/bin/perl -w
use DBI;
our $db = DBI->connect(...);
__END__
Run Code Online (Sandbox Code Playgroud)
现在我想在我的模块中使用$ db变量,因为我想避免重复连接和重复代码......有可能吗?
你可以通过参考$main::db其他包来做到这一点.该main命名空间总是指向全局中的首要命名空间如果没有给出让利.你应该阅读package.
请注意,这不是一个好主意,因为您的模块将依赖于main连接.相反,您应该以允许传递数据库句柄的方式构造对象.如果您需要不惜一切代价建立数据库连接,请让它们抛出异常或创建自己的数据库句柄.
如果您不使用OO代码,请使数据库处理每个函数调用的参数.
另请注意,最佳方法是命名数据库句柄$dbh.
让我们看看非OO(Foo)和OO(Bar).
# this is package main (but you don't need to say so)
use strictures;
use DBI;
use Foo;
use Bar;
my $dbh = DBI->connect($dsn);
Foo::frobnicate($dbh, 1, 2)
my $bar = Bar->new(dbh => $dbh);
$bar->frobnicate(23);
package Foo;
use strictures;
sub frobnicate {
my ($dbh, $one, $two) = @_;
die q{No dbh given} unless $dbh; # could check ref($dbh)
$dbh->do( ... );
return;
}
package Bar;
use strictures;
sub new {
my ($class, %args) = @_;
die q{No dbh given} unless $args{dbh};
return bless \%args, $class;
}
sub frobnicate {
my ($self, $stuff) = @_;
$self->{dbh}->do(q{INSERT INTO bar SET baz=?}, undef, $stuff);
return;
}
__END__
Run Code Online (Sandbox Code Playgroud)