好的,我放弃并寻求帮助;
我有一个脚本来访问MySQL数据库中的信息。我希望我的凭据隐藏在我可以包含的文件中以确保安全。为了使它更整洁,我尝试在我的cgi-bin目录中创建一个子目录(include)。
这是一个省略所有数据库内容的简单示例(因为这不是我的问题)。
#!/usr/bin/perl
use strict;
use warnings;
$data_base = 'dbi::mysql::test_db';
$db_user = 'some_user';
$db_pw = 'password';
#!/usr/bin/perl
use strict;
use warnings;
use DBI;
require'/include/config.pl';
$param1 = $data_base;
$param2 = $db_user;
$param3 = $db_pw;
我得到的第一个错误是找不到包含。我还看到很多帖子显示在vars前添加our
。此外,大多数帖子都提到完全没有使用require
,但对于简单的事情我更愿意。
我最后学习了一些关于如何制作模块的教程。我得到了它的工作,但这似乎是一个简单的配置文件的很多努力。
答案 0 :(得分:5)
让我们回到你正在做的事情,但是......
当您使用require
时,它实际上会在执行期间读入文件。但是,作为require状态的Perldoc:
该文件是通过do-FILE机制包含的,它基本上只是各种“eval”,需要注意的是 调用脚本中的词法变量将不可见 到包含的代码。
词法(又名本地变量,又名my
变量)将无效。您需要包(也称为全局,又名our
)变量。
这是一个简单的测试:
#! /usr/bin/env perl
use 5.10.0;
use warnings;
our $variable;
require 'include.pl';
say "The value of \$foo is $foo";
$foo = "I am foo (honest!)";
1;
如果我运行test.pl
,我会得到:
The value of $foo is I am foo (honest!)
我看到一些问题。首先,您强迫自己使用特定变量作为您的帐户和密码。这不是一个很棒的编程想法。它基本上是看不见的东西。
为什么不使用真正的INI文件,而不是包含在文件中。我之前使用的Perl模块叫Config::Ini,它非常容易使用。您创建一个类似于INI文件的Windows,并从中读取您的信息。
如果您不想使用INI文件,请使用子例程。这样,您就不必使用our
个变量,也不会说您的密码必须是$password
。毕竟,这个配置文件很可能会用于多个程序。这只是更好的编程:
#! /usr/bin/env perl
use 5.10.1;
use warnings;
require "config.pl";
my $password = get_password();
my $account = get_account();
use 5.10.1;
use warnings;
sub get_password { return "swordfish" );
sub get_account { return "some_user" };
sub get_db { return "database_name" };
1;
答案 1 :(得分:2)
您在require
中提供的路径已关闭:您指定了绝对路径,但您错误地将服务器的docroot误认为是实际的文件系统根目录。
/include/config.pl
锚定在文件系统根目录,与/usr/bin/perl
的方式相同。
./include/config.pl
将是相对于当前目录的路径(可能是cgi-bin
文件夹)并且可能更好。如果您知道cgi-bin目录的绝对路径,则可以使用绝对路径:/var/www/whatever/structure/the/host/has/htdocs/cgi-bin/include/config.pl
如果您使用的是Web框架(我希望您是)而不是简单,过时的CGI,则可能已存在配置文件。例如。 Dancer有一个YAML文件,其中包含许多可以扩展的设置。