Mie*_*iek 1 perl global-variables require
好的,我放弃了并寻求帮助;
我有一个脚本来访问MySQL数据库中的信息.我希望我的凭据隐藏在我可以包含的文件中以确保安全.为了使它更整洁,我试图在我的cgi-bin目录中创建一个子目录(include).
这是一个省略所有数据库内容的简单示例(因为这不是我的问题).
#!/usr/bin/perl
use strict;
use warnings;
$data_base = 'dbi::mysql::test_db';
$db_user = 'some_user';
$db_pw = 'password';
Run Code Online (Sandbox Code Playgroud)
#!/usr/bin/perl
use strict;
use warnings;
use DBI;
require'/include/config.pl';
$param1 = $data_base;
$param2 = $db_user;
$param3 = $db_pw;
Run Code Online (Sandbox Code Playgroud)
我得到的第一个错误是找不到包含.我还看到许多帖子显示our在vars前面添加.大多数帖子都提到不使用require,但对于简单的事情,我宁愿.
我最后学习了一些关于如何制作模块的教程.我得到了它的工作,但这似乎是一个简单的配置文件的很多努力.
让我们回到你正在做的事情,不过......
使用时require,它实际上在执行期间读入文件.但是,作为要求状态的Perldoc :
该文件通过do-FILE机制包含在内,该机制基本上只是各种"eval",需要注意的是调用脚本中的词汇变量对包含的代码是不可见的.
词法(也称为局部变量,又称my变量)将不起作用.你需要包(aka global,aka our)变量.
这是一个简单的测试:
#! /usr/bin/env perl
use 5.10.0;
use warnings;
our $variable;
require 'include.pl';
say "The value of \$foo is $foo";
Run Code Online (Sandbox Code Playgroud)
$foo = "I am foo (honest!)";
1;
Run Code Online (Sandbox Code Playgroud)
如果我跑test.pl,我得到:
The value of $foo is I am foo (honest!)
Run Code Online (Sandbox Code Playgroud)
我看到一些问题.首先,您强迫自己使用特定变量作为您的帐户和密码.这不是一个很棒的编程想法.它基本上是看不见的东西.
而不是包含在文件中,为什么不使用真正的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();
Run Code Online (Sandbox Code Playgroud)
use 5.10.1;
use warnings;
sub get_password { return "swordfish" );
sub get_account { return "some_user" };
sub get_db { return "database_name" };
1;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17934 次 |
| 最近记录: |