使用Perl访问PHP数组
我主要是一名PHP开发人员,对Perl的使用经验有限 我的任务是用Perl编写一个队列脚本来检查数据库,这一切都很好 我遇到的问题是,在Perl脚本中,我需要包含数据库主机名和密码 现在我已经对它们进行了硬编码,效果很好,但是我的PHP应用程序使用了一个全局PHP数组来保存数据库的主机名和密码 这是我的PHP数组使用Perl访问PHP数组,php,perl,Php,Perl,我主要是一名PHP开发人员,对Perl的使用经验有限 我的任务是用Perl编写一个队列脚本来检查数据库,这一切都很好 我遇到的问题是,在Perl脚本中,我需要包含数据库主机名和密码 现在我已经对它们进行了硬编码,效果很好,但是我的PHP应用程序使用了一个全局PHP数组来保存数据库的主机名和密码 这是我的PHP数组 <?php return array( 'database' => array( 'master' => array(
<?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访问该文件
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);
有,它使用源过滤器让您在Perl代码中有PHP块来声明变量。它还有一个read_file()
函数,可以将这样的过滤器应用于单个PHP文件
但它似乎期望您的PHP具有赋值(例如,$config=array('database'=>array(…
)并将其更改为Perl变量声明)
在玩了几分钟之后,我无法让它对使用return
的PHP代码做任何有用的事情,这里有这么多好的信息,它帮助我想出了一个可行的解决方案
下面是我正在使用的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;
这对我来说是个好办法。谢谢!提供一个简短的PHP程序,将数组转储到JSON格式的文件中会很简单。然后可以使用模块从Perl读取该文件
这是所有必要的
<?php
$array = include 'array.php';
$fh = fopen('array.json', 'w');
fwrite($fh, json_encode($array));
fclose($fh);
?>
如果您想要一个更“原生的Perl”解决方案,您几乎可以*只需搜索并将所有“数组(“及其匹配”)”替换为“{”和“}”。这将为您提供一个称为“散列”的Perl数据结构(注:与PHP不同,Perl将带有整数标记的数组称为数组(并使用@sigil表示包含它们的变量),但将带有字符串标记的类似数组的东西称为“hash”(并使用%sigil表示包含它们的变量)。您可能想了解的Perl关键字/概念有:
Perl数据结构:
特别是散列的散列部分:
如果您不理解$hashref=\%hash和%hash{key}以及$hashref->{key}在Perl中的含义,那么您应该阅读
示例代码(请注意getConfig子例程与PHP代码的相似性):
- 我说“差不多”,因为您的示例数据对slave->profile值使用了裸露的单词“true”——这在Perl中是一个语法错误——您可以将其更改为裸露的1,或者将该值引用为“true”以使其工作。在Perl中,数字0、字符串“0”或空/nul字符串“都计算为“false”在布尔上下文中,其他任何内容的计算结果都是“true”。如果您选择自动将PHP转换为Perl,请小心,可能还有其他PHP ISM会像这样吸引您
关联数组在Perl中称为哈希。搜索它,然后perldsc。为什么不使用文件并在PHP和Perl中包含其数据?更具体地说,哈希这个全局文件实际上是Zend Framework 2的一部分,这就是框架使用文件的方式。否则,是的,JSON最好使用=)ikegami将全局php文件更改为同时解析json的建议对您有效吗?@ikegami:请随意制定一个完整的答案,我将删除此:)
<?php
$array = include 'array.php';
$fh = fopen('array.json', 'w');
fwrite($fh, json_encode($array));
fclose($fh);
?>
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"),
},
},
}
#!/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'
}
}
};
}