python如何读取以perl格式编写的变量?

时间:2016-06-22 01:14:17

标签: perl python-2.7 variables

您的python代码需要读取变量文件(以perl格式编写)并识别要在python脚本中使用的变量。我的变量文件(variable.txt)写为:

regexp = %r/((returned|undelivered)\smail|mail\sdelivery(\sfailed)?)/x

我希望我的python代码读取上面的文件并识别变量。我使用下面的代码来读取文件

$x=1.2;
$y=90.2;
$z=4.2334;
$img1='version1.png';
$img2='version2.png';

上面的代码将读取variable.txt文件中的所有行,但python代码不会将它们识别为变量。我的意思是当我使用这些变量时

fp=open("variables.txt","r")
var=fp.read()
fp.close
print(var)

我想获得A = 91.4,但错误显示

  

“名称'x'未定义

当我试图通过

打开图像时
 e.g. A=x+y

它不起作用并显示

  

没有这样的文件或目录:'img1'

那么,任何人都可以建议我如何命令使pyl脚本读取perl格式的变量? TKS

2 个答案:

答案 0 :(得分:3)

我强烈建议您不要想要解析这样的变量文件,而是使用定义的数据传输格式。

查看您的源数据 - JSON看起来不错。为了简化这一过程,请将其插入名称空间,例如哈希:

#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
use JSON;

my %export = ( x => 1.2,
               y => 90.2,
               z => 4.2334,
               img => [ 'version1.png', 'version2.png' ] ); 

print Dumper \%export;

open ( my $transfer, '>', 'transfer.json' ) or die $!; 
print {$transfer} to_json ( \%export, {pretty => 1});
close ( $transfer ); 

哪个给出 - 在你的文件中:

{
   "z" : 4.2334,
   "x" : 1.2,
   "img" : [
      "version1.png",
      "version2.png"
   ],
   "y" : 90.2
}

任何语言中应该可以轻易读取。 (包括Python)。

答案 1 :(得分:0)

您还可以从Python中运行以运行以下Perl程序,该程序将 variables.txt 文件视为Perl代码,并将其中声明的所有变量包装到JSON对象中,打印那个。

perl -MJSON -e '
package Foo;
do "variable.txt";
package main;
my $export;
foreach my $key (keys %{Foo::}) {
    next if $key eq "BEGIN";
    $export->{$key} = ${"Foo::$key"};
}
print JSON::encode_json($export);'

因此,您基本上将其作为子流程运行或在Python中打开它,捕获输出并将其JSON解码为Python数据结构。

JSON输出看起来像这样。

{
    'x': 1.2,
    'y': 90.2,
    'z': 4.2334,
    'img1': 'version1.png',
    'img2': 'version2.png'
}

这可以通过在单独的do中使用package来包含变量定义文件并将其视为Perl代码(如PHP的require)。包基本上是命名空间定义。然后它切换回 main 包(这是Perl程序中的默认包)并读取另一个命名空间的符号表。它包含我们刚读取和定义的所有变量。

因为它们没有用my声明,所以它们被视为包变量而不是词法。因为没有use strict,程序不会抱怨。

符号表可能包含其他内容。当我尝试这个时(没有do)它有一个BEGIN块定义。因为我很懒,所以我只是明确地解析了那个。您可以开始在符号表中查看这些内容的引用类型,但我认为这不值得付出努力。 Foo 包不应该包含任何其他内容。

然后将它们作为键分配到哈希引用中,然后将其转换为JSON并输出它。

我确实认为将数据交换格式更改为JSON as Sobrique suggests是更好的方法。