1

わかりました、私はあきらめて助けを求めています。

MySQL データベースの情報にアクセスするためのスクリプトがあります。セキュリティのために含めることができるファイルに自分の資格情報を埋めたい. もう少しきれいにするために、cgi-bin ディレクトリにサブディレクトリ (インクルード) を作成しようとしました。

これは、すべてのデータベースを省略した単純な例です (これは私の問題ではないため)。

config.pl (インクルードディレクトリ内)

#!/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;

最初に表示されるエラーは、インクルードが見つかりません。ourまた、変数の前に追加することを示す多くの投稿を見てきました。また、ほとんどの投稿ではまったく使用requireしていないと述べていますが、単純なことについてはむしろ使用したいと考えています。

モジュールの作成方法に関するいくつかのチュートリアルに従うことになりました。動作するようになりましたが、単純な構成ファイルの場合は大変な作業のようです。

4

2 に答える 2

5

しかし、あなたがしていることに戻りましょう...

を使用するrequireと、実行中に実際にファイルが読み込まれます。ただし、 require状態の Perldoc として:

ファイルは do-FILE メカニズムを介してインクルードされます。これは基本的に、呼び出しスクリプトのレキシカル変数がインクルードされたコードから見えないという警告を伴うさまざまな「評価」です。

レキシカル (別名ローカル変数、別名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;
于 2013-04-12T00:36:31.350 に答える
2

で指定したパスrequireがずれています: 絶対パスを指定しましたが、サーバーのドキュメントルートを実際のファイルシステムのルートと間違えました。

/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

プレーンで時代遅れの CGI の代わりに Web フレームワークを使用している場合 (そうであることを願っています)、構成ファイルが既に存在する可能性があります。たとえば、Dancer には、拡張可能な多くの設定を含む YAML ファイルがあります。

于 2013-04-11T23:58:48.523 に答える