$dbhandler = @_;
Это проблема.Вы присваиваете в скалярном контексте - поэтому значение scalar(@_)
будет присвоено $dbhandler
- в этом случае 1, поскольку вы передали список параметров из 1 элемента.
Это должно быть: ($dbhandler) = @_;
чтобы использовать контекст списка или в качестве альтернативной идиомы, $dbhandler = shift;
Контрастность:
$ perl -e 'sub x { $x = @_ ; print "$x\n"} ; x(33);'
1
$ perl -e 'sub x { ($x) = @_ ; print "$x\n"} ; x(33);'
33
Вторая, не связанная с этим проблема, заключается в том, что вы неправильно назвали свою переменную.У вас есть $dbh
в основном скрипте, но после его назначения вы продолжаете использовать $databaseHandler
.
if ( defined $databaseHandler ) # BAD
if ( defined $dbh ) # GOOD
Вышеприведенная ошибка (использование $databaseHandler
вместо $dbh
) не отображается/ значения, если ваши модули определены в том же файле, что и основной сценарий над ним, потому что объявление my $databaseHandler
первого модуля помещает эту переменную в область действия остальной части файла (включая основной сценарий).Но он будет STOP работать, если ваш модуль находится в отдельном файле (второй пример ниже)
$ cat /tmp/p1.pm
package p1;
my $v = undef;
sub x {
$v = 3;
}
1;
$ cat /tmp/x1.pl
use p1;
my $c = p1::x();
my $v_print = defined $v ? $v : "_UNDEF_";
print "v=$v_print\nc=$c\n";
$ perl -I /tmp /tmp/x1.pl
v=_UNDEF_
c=3
###############################################
$ cat /tmp/x2.pl
package p1;
my $v = undef;
sub x {
$v = 3;
}
1; # END package p1
package main;
my $c = p1::x();
my $v_print = defined $v ? $v : "_UNDEF_";
print "v=$v_print\nc=$c\n";
$ perl /tmp/x2.pl
v=3
c=3