Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Perl访问PHP数组_Php_Perl - Fatal编程技术网

使用Perl访问PHP数组

使用Perl访问PHP数组,php,perl,Php,Perl,我主要是一名PHP开发人员,对Perl的使用经验有限 我的任务是用Perl编写一个队列脚本来检查数据库,这一切都很好 我遇到的问题是,在Perl脚本中,我需要包含数据库主机名和密码 现在我已经对它们进行了硬编码,效果很好,但是我的PHP应用程序使用了一个全局PHP数组来保存数据库的主机名和密码 这是我的PHP数组 <?php return array( 'database' => array( 'master' => array(

我主要是一名PHP开发人员,对Perl的使用经验有限

我的任务是用Perl编写一个队列脚本来检查数据库,这一切都很好

我遇到的问题是,在Perl脚本中,我需要包含数据库主机名和密码

现在我已经对它们进行了硬编码,效果很好,但是我的PHP应用程序使用了一个全局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访问该文件

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'
        }
    }
  };
}