0

私は主に PHP 開発者であり、Perl の経験はほとんどありません。

私は Perl でデータベースをチェックするキュー スクリプトを作成する任務を負っていましたが、それはすべてうまくいっています。

問題は、Perl スクリプトにデータベースのホスト名とパスワードを含める必要があることです。

現在、ハードコーディングされており、正常に動作しますが、私の PHP アプリケーションは、データベースのホスト名とパスワードを保持するグローバル PHP 配列を使用しています。Perl スクリプトでこの PHP 配列を使用できるようにしたいと考えています。

ここに私のPHP配列があります

<?php
return array(
    'database' => array(
        'master' => array(
            'hostname' => 'fd35:4776:6804:2:a::1',
            'password' => 'password'
        ),
        'slave' => array(
            'hostname' => 'fd35:4776:6804:2:2::2',
            'password' => 'password',
            'profile'  => true
        )
    )
);

Google で検索してみたり、オンラインでランダムな投稿をたくさん読んだりしましたが、まだ解決策を思いつくことができませんでした。

私が試すことができるアイデアはありますか?追加の情報が不足している場合はお知らせください。提供できます。

編集

うまくいけば、私はこれを適切に表現しました。この PHP 配列ファイルを Perl で操作できるようにするには、どうすればよいでしょうか?

代替ソリューションも大歓迎です!

4

5 に答える 5

7

コードが不適切な構成ファイルを作成する多くの理由の 1 つを発見しました。情報を実際の構成ファイルに移動し、.php ファイルと Perl の両方からそのファイルにアクセスする必要があります。

ここでは、JSON が適切なファイル形式になります。

{
   "database": {
      "master": {
        "hostname": "fd35:4776:6804:2:a::1",
        "password": "password"
      },
      "slave": {
        "hostname": "fd35:4776:6804:2:2::2",
        "password": "password",
        "profile":  true
      }
   }
}

Perl コードは次のようになります。

use JSON::XS qw( decode_json );
open (my $fh, '<:raw', $config_path)
   or die("Can't open config file $config_path: $!\n");
my $file; { local $/; $file = <$fh>; }
my $config = decode_json($file);

PHP 側では、投稿で示したファイルの内容を、構成ファイルを読み取るコードに置き換えるだけです。PHP はわかりませんが、かなり単純なはずです。クイック検索で、

return json_decode(file_get_contents($config_path));
于 2013-03-03T16:59:41.833 に答える
2

配列を JSON 形式のファイルにダンプする短い PHP プログラムを提供するのは簡単です。JSONそのファイルは、モジュールを使用して Perl から読み取ることができます。

必要なのはこれだけです。

<?php
  $array = include 'array.php';
  $fh = fopen('array.json', 'w');
  fwrite($fh, json_encode($array));
  fclose($fh);
?>

結果の JSON ファイルは、次のように Perl プログラムで読み取ることができます。

use strict;
use warnings;

use JSON 'from_json';

my $data = do {
  open my $fh, '<', 'array.json' or die $!;
  local $/;
  from_json(<$fh>);
};

use Data::Dump;
dd $data;

出力

{
  database => {
    master => { hostname => "fd35:4776:6804:2:a::1", password => "password" },
    slave  => {
                hostname => "fd35:4776:6804:2:2::2",
                password => "password",
                profile  => bless(do{\(my $o = 1)}, "JSON::XS::Boolean"),
              },
  },
}
于 2013-03-03T18:28:30.193 に答える
1

より「ネイティブな Perl」ソリューションが必要な場合は、「array(」とそれに一致する「)」をすべて検索して「{」と「}」に置き換えるだけです。これにより、「ハッシュのハッシュ」と呼ばれる perl データ構造が得られます (注: PHP とは異なり、Perl は整数インデックスを持つ配列を配列として参照します (そして @ 印を使用してそれらを含む変数を示します)、配列のようなものを参照します)。文字列インデックスを「ハッシュ」として使用します(そして、それらを含む変数を示すために % 印を使用します))。おそらくあなたが読みたいと思うPerlのキーワード/概念は次のとおりです:

Perl データ構造: http://perldoc.perl.org/perldsc.html

特に Hash Of Hashes セクション: http://perldoc.perl.org/perldsc.html#HASHES-OF-HASHES

また、Perl で $hashref = \%hash と %hash{key} と $hashref->{key} が何を意味するのか理解できない場合は、http://perldoc.perl.org/perlref.html を読んでください

コード例 (getConfig サブルーチンが PHP コードといかに似ているかに注意してください):

#!/usr/bin/perl
use strict;
use warnings;

my $config=getConfig();

print "Database master host = " . $config->{database}{master}{hostname};
print "\n";

print "Database master password = " . $config->{database}{master}{password};
print "\n";

print "Database slave profile = " . $config->{database}{slave}{profile};
print "\n";

sub getConfig{
  return {
    'database' => {
        'master' => {
            'hostname' => 'fd35:4776:6804:2:a::1',
            'password' => 'password'
        },
        'slave' => {
            'hostname' => 'fd35:4776:6804:2:2::2',
            'password' => 'password',
            'profile'  => 'true'
        }
    }
  };
}
  • あなたのサンプルデータはslave->profile値に裸の単語「true」を使用しているため、「かなり」と言いました-これはPerlの構文エラーです-裸の1に変更するか、値を「true」として引用できますそれを機能させるために。Perl では、数字のゼロ、文字列 "0"、または空/ヌル文字列 "" はすべて、ブール コンテキストで "false" と評価され、それ以外は "true" と評価されます。PHP から Perl への変換を自動化することを選択した場合は注意してください。他の PHP 主義があなたをそのように捉える可能性があります。
于 2013-03-03T22:41:59.190 に答える
1

PHP::Includeソース フィルターを使用して Perl コードに PHP ブロックを配置し、変数を宣言できるようにする があります。read_file()このようなフィルターを単一の PHP ファイルに適用する機能もあります。

$config = array('database' => array(...しかし、PHP には代入 (例: ) があり、それらを Perl 変数宣言に変更することを期待しているようです。

数分遊んだだけでは、return.

于 2013-03-03T17:08:09.897 に答える
0

ここには非常に多くの優れた情報があり、実用的なソリューションを考え出すのにかなり役立ちました.

これが私が働いているperlスクリプトです:

#!/usr/bin/perl

use PHP::Include;

include_php_vars( 'config.local.php' );

my $test = \%config;

print $test->{'database'}->{'master'}->{'hostname'};

また、PHP 配列を取得し、それを変更して、それ以上ではなくreturn array()$config = array()その後return $config;

これは私にとってはうまくいきました。ありがとうございました!

于 2013-03-03T18:27:24.420 に答える