将perl变量导入模块

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变量,因为我想避免重复连接和重复代码......有可能吗?

sim*_*que 5

你可以通过参考$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)