如何在perl脚本中包含配置类型文件

时间:2013-04-11 23:44:27

标签: perl global-variables require

好的,我放弃并寻求帮助;

我有一个脚本来访问MySQL数据库中的信息。我希望我的凭据隐藏在我可以包含的文件中以确保安全。为了使它更整洁,我尝试在我的cgi-bin目录中创建一个子目录(include)。

这是一个省略所有数据库内容的简单示例(因为这不是我的问题)。

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;

我得到的第一个错误是找不到包含。我还看到很多帖子显示在vars前添加our。此外,大多数帖子都提到完全没有使用require,但对于简单的事情我更愿意。

我最后学习了一些关于如何制作模块的教程。我得到了它的工作,但这似乎是一个简单的配置文件的很多努力。

2 个答案:

答案 0 :(得分:5)

让我们回到你正在做的事情,但是......

当您使用require时,它实际上会在执行期间读入文件。但是,作为require状态的Perldoc:

  

该文件是通过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文件,而不是包含在文件中。我之前使用的Perl模块叫Config::Ini,它非常容易使用。您创建一个类似于INI文件的Windows,并从中读取您的信息。

如果您不想使用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;

答案 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文件,其中包含许多可以扩展的设置。