Perl и аналог include из PHP

Модератор: Модераторы разделов

IMB
Сообщения: 2567
ОС: Debian

Perl и аналог include из PHP

Сообщение IMB »

Доброго дня!
Продолжая изучать Perl пишу web-интерфейс. На данный момент в index.pl есть конструкция вида:

Код: Выделить всё

use CGI qw/:all/;
use Time::localtime;
use File::Basename;
unshift(@INC, dirname($0));
.................................
if (request_method() eq 'POST') {
        require 'db.pl';
        if (param('to') eq 'passwd') {
                require 'passwd.pl'
        }
} else {
        if (param('to') eq 'passwd') {
                require 'passwd.pl';
        } else {

        }
}

По идее в зависимости от выбранной ссылке будет загружен тот или иной файл. При использовании GET вроде работает, при использовании POST нет.
Файл db.pl предполагается подключать в другие файлы которым требуется работать с базой данных:

Код: Выделить всё

#!/usr/bin/perl -w
#vim:ts=4:sw=4
use strict;
use DBI;
my $dbtype = 'mysql';
my $dbname = 'test';
my $dbuser = 'iser';
my $dbpasswd = 'passwd';
my $dbh = DBI->connect("DBI:$dbtype:$dbname", $dbuser, $dbpasswd);
1;

Файл passwd.pl:

Код: Выделить всё

................................
if (param('old') && param('new') && param('new2')) {
        my $old = param('old');
        my $new = param('new');
        my $new2 = param('new2');

        print $old, $dbtype;
        my $sth = $dbh->prepare("SELECT password FROM users " .
                "WHERE password = MD5('$old') AND ");
        $sth->execute();
        if ($sth->rows) {
......................................

В логах сервера сообщения вида:

Код: Выделить всё

Use of uninitialized value $dbtype in print at /var/www/vexim/passwd.pl line 20.
Use of uninitialized value $dbtype in print at /var/www/vexim/passwd.pl line 20.
Can't call method "prepare" on an undefined value at /var/www/vexim/passwd.pl line 21.
Compilation failed in require at /var/www/vexim/index.pl line 34.

Насколько я понимая это из того, что файл db.pl корректно не подключился.
Где я ошибся?
Спасибо.
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: Perl и аналог include из PHP

Сообщение MakkyWelly »

А вы уберите объявление "my" перед теми переменными, которые планируются использовать глобально:

Код: Выделить всё

# 1.pl
my $abc = "Hello";

#2.pl
require '1.pl';
print $abc;

Так не найдет $abc, нужно так:

Код: Выделить всё

# 1.pl
$abc = "Hello";

#2.pl
require '1.pl';
print $abc;
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Perl и аналог include из PHP

Сообщение IMB »

Спасибо, но не думаю, что это решение вопроса.
Вернее сказать выход, но мне он не кажется красивым. А заморачиваться с написанием модуля для работы с SQL не хочеться.
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Perl и аналог include из PHP

Сообщение diesel »

Код: Выделить всё

my $dbtype = 'mysql';
my $dbname = 'test';
my $dbuser = 'iser';
my $dbpasswd = 'passwd';
my $dbh = DBI->connect("DBI:$dbtype:$dbname", $dbuser, $dbpasswd);

завернуть в функцию которая будет возвращать $dbh:

Код: Выделить всё

sub mysql_init {
my $dbtype = 'mysql';
my $dbname = 'test';
my $dbuser = 'iser';
my $dbpasswd = 'passwd';
my $dbh = DBI->connect("DBI:$dbtype:$dbname", $dbuser, $dbpasswd);
return $dbh;
}


вызывать ее с тех мест где требуется $dbh:

Код: Выделить всё

................................
if (param('old') && param('new') && param('new2')) {
        my $old = param('old');
        my $new = param('new');
        my $new2 = param('new2');

        print $old, $dbtype;

        require db.pl;
        my $dbh = mysql_init();
        my $sth = $dbh->prepare("SELECT password FROM users " .
                "WHERE password = MD5('$old') AND ");
        $sth->execute();
        if ($sth->rows) {
......................................


или же смотрите в сторону того как експортировать переменные с модулей: http://stein.cshl.org/genome_informatics/u...les/export.html
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Perl и аналог include из PHP

Сообщение IMB »

Спасибо, тоже вариант.
Сейчас сделал так:

Код: Выделить всё

#!/usr/bin/perl -w
use strict;
use DBI;
my $dbtype = 'mysql';
my $dbname = 'mail';
my $dbuser = 'sqlmail';
my $dbpasswd = 'sqlmail';
our $dbh = DBI->connect("DBI:$dbtype:$dbname", $dbuser, $dbpasswd);
1;

Вроде работает.
Спасибо сказали: