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
        )
    )
);

我试过用谷歌搜索并在网上阅读了许多随机帖子,但我还没有想出一个解决方案。

有没有人有任何我可以尝试的想法?如果我缺少任何其他输入,请告诉我,我可以提供。

编辑

希望我措辞正确。我将如何包含这个 PHP 数组文件以便我可以使用 Perl 操作它?

也欢迎替代解决方案!

4

5 回答 5

7

您已经发现了代码导致错误配置文件的众多原因之一。您应该将信息移动到一个实际的配置文件,并从该 .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

提供一个简短的 PHP 程序将数组转储到 JSON 格式的文件中会很简单。然后可以使用该JSON模块从 Perl 读取该文件。

这就是所有必要的。

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

然后可以在 Perl 程序中读取生成的 JSON 文件,如下所示:

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

PHP::Include,它使用源过滤器让您在 Perl 代码中使用 PHP 块来声明变量。它还具有read_file()将此类过滤器应用于单个 PHP 文件的功能。

但似乎期望您的 PHP 有赋值(例如$config = array('database' => array(...)并将它们更改为 Perl 变量声明。

在玩了几分钟后,我无法让它对使用return.

于 2013-03-03T17:08:09.897 回答
1

如果你想要一个更“原生 Perl”的解决方案,你几乎可以*搜索并将所有“array(”及其匹配的“)”替换为“{”和“}”。这将为您提供一个称为“散列哈希”的 perl 数据结构(注意:与 PHP 不同,Perl 将具有整数索引的数组称为数组(并使用 @sigil 表示包含它们的变量),但指的是类似数组的东西将字符串索引作为“哈希”(并使用 % sigil 表示包含它们的变量)。您可能想要阅读的 Perl 关键字/概念是:

Perl 数据结构: http: //perldoc.perl.org/perldsc.html

特别是哈希部分:http://perldoc.perl.org/perldsc.html#HASHES-OF-HASHES

如果您不明白 $hashref = \%hash 和 %hash{key} 和 $hashref->{key} 在 Perl 中的含义,您可以阅读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”或空/空字符串“”在布尔上下文中都计算为“假”,其他任何东西都计算为“真”。如果您选择自动化 PHP 到 Perl 的翻译,请注意,可能有其他 PHP 主义可能会像这样让您失望。
于 2013-03-03T22:41:59.190 回答
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 回答