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



好吧,我放弃了,寻求帮助;

我有一个脚本访问信息在我的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文件,里面有很多可以展开的设置。

相关内容

  • 没有找到相关文章

最新更新