好吧,我放弃了,寻求帮助;
我有一个脚本访问信息在我的MySQL数据库。为了安全起见,我想把我的证件藏在一个文件里。为了使它更整洁,我尝试在我的cgi-bin目录中创建一个子目录(包括)。
这是一个简单的例子,省略了所有db的东西(因为这不是我的问题)。
config.pl(在include目录中)
#!/usr/bin/perl
use strict;
use warnings;
$data_base = 'dbi::mysql::test_db';
$db_user = 'some_user';
$db_pw = 'password';
test_driver.pl(在cgi-bin目录下)#!/usr/bin/perl
use strict;
use warnings;
use DBI;
require'/include/config.pl';
$param1 = $data_base;
$param2 = $db_user;
$param3 = $db_pw;
我得到的第一个错误是不能找到包含。我还看到许多帖子显示在var前面添加our
。此外,大多数帖子都提到根本不使用require
,但对于简单的事情,我宁愿。
我最后跟随一些教程如何制作一个模块。我得到了它的工作,但这似乎是一个简单的配置文件很多努力
让我们回到你正在做的事情。
当您使用require
时,它实际上在执行过程中读取文件。然而,作为Perldoc for require状态:
文件是通过do-FILE机制包含的,它本质上只是"eval"的一种变体,但需要注意的是,调用脚本中的词法变量对包含的代码是不可见的。
词法变量(又名本地变量,又名my
变量)不起作用。你需要包变量(又名全局变量,又名our
)。
这里有一个简单的测试:
test.pl
#! /usr/bin/env perl
use 5.10.0;
use warnings;
our $variable;
require 'include.pl';
say "The value of $foo is $foo";
include.pl
$foo = "I am foo (honest!)";
1;
如果运行test.pl
,我得到:
The value of $foo is I am foo (honest!)
我看到一些问题。首先,您强迫自己使用一个特定的变量作为您的帐户和密码。这并不是一个很好的编程理念。它基本上是发生在视线之外的不可见的东西。
在文件中包含而不是,为什么不使用真正的INI文件呢?我以前使用过一个名为Config::Ini的Perl模块,它相当容易使用。你创建一个类似Windows的INI文件,并从中读取你的信息。
如果不想使用INI文件,请使用子例程。这样,您就不必使用our
变量,也不必坚持说您的密码必须是$password
。毕竟,这个配置文件很可能会用于多个程序。这只是更好的编程:
test_driver.pl
#! /usr/bin/env perl
use 5.10.1;
use warnings;
require "config.pl";
my $password = get_password();
my $account = get_account();
config.pl
use 5.10.1;
use warnings;
sub get_password { return "swordfish" );
sub get_account { return "some_user" };
sub get_db { return "database_name" };
1;
您在require
中提供的路径是off:您指定了一个绝对路径,但是您将服务器的doroot误认为是实际的文件系统根。
/include/config.pl
锚定在文件系统根目录,/usr/bin/perl
也是如此。
./include/config.pl
将是相对于当前目录(假定是cgi-bin
文件夹)的路径,并且可能会更好地工作。如果您知道cgi-bin dir的绝对路径,则可以使用绝对路径:/var/www/whatever/structure/the/host/has/htdocs/cgi-bin/include/config.pl
如果你正在使用web框架(我希望你是),而不是普通的,过时的,CGI,可能已经有一个配置文件。例如,Dancer有一个YAML文件,里面有很多可以展开的设置。