Perl 使用嵌套大括号分析配置文件

Perl 使用嵌套大括号分析配置文件,perl,parsing,Perl,Parsing,我把这个脚本放在一起,得到成员方括号内的内容 这不是JSON,只是一个括号内的配置文件。我正在努力想一个更好的办法 这家商店使用的模块非常有限,这就是我不得不使用的原因 开关标签。如果这真的可以通过一个模块来完成,那么我想我可以得到一份申请 添加新模块 尽管如此,有没有一种方法可以像使用while循环而不是用on或off标记每个括号一样,只获取成员{…}中的内容 #!/sbcimp/dyn/data/EVT/GSD/scripts/perl/bin/perl use strict; use wa

我把这个脚本放在一起,得到成员方括号内的内容

这不是JSON,只是一个括号内的配置文件。我正在努力想一个更好的办法

这家商店使用的模块非常有限,这就是我不得不使用的原因 开关标签。如果这真的可以通过一个模块来完成,那么我想我可以得到一份申请 添加新模块

尽管如此,有没有一种方法可以像使用while循环而不是用on或off标记每个括号一样,只获取成员
{…}
中的内容

#!/sbcimp/dyn/data/EVT/GSD/scripts/perl/bin/perl
use strict;
use warnings;

my %penny_hash = ();

my $penny_file = "penny_config.cfg";

open(FOOO, "<$penny_file") or die "Can't open $penny_file for reading: $!";

foreach my $line (<FOOO>) {
   chomp($line);

   if ($line =~ /^\s*TickSize\s+=\s+\{/) {
      $ticksize_flag = 1;
   }
   elsif (($ticksize_flag == 1) && ($line =~ /^\s*penny.*\s+=\s+\{/)) {
      $penny_flag = 1;
   }
   elsif (($penny_flag == 1) && ($line =~ /^\s*members\s+=\s+\{/)) {
      $member_flag = 1;
   }
   elsif (($member_flag == 1) && ($line =~ /\}/)) {
      $member_flag = 0;
   }
   elsif (($member_flag == 1) && ($line =~ /\s*(\S+)\s*$/)) {
      print $line ;
      print "\n";
   }
}

您所写的只是从原始文件中删除注释和字段名。没有必要为此付出如此大的努力

该程序产生相同的输出

use strict;
use warnings;
use autodie;

open my $fh, '<', 'penny_config.cfg';

while (<$fh>) {
  next unless /\S/;
  print unless /[#{}=]/;
}
使用严格;
使用警告;
使用自动模具;

打开我的$fh,“已经有人评论说您应该查看Config::General或YAML。您应该看看Config::General和YAML

YAML与JSON兼容,但提供了比JSON更多的功能。因为您的数据看起来已经有点像JSON,所以将其转换为JSON将允许您使用现有的JSON或YAML工具来解释它

Config::General是按照Apache配置文件格式建模的,具有比YAML更好的特性集。一旦您对Config::General足够熟悉,就可以像JSON一样轻松地将数据迁移到其中。对于我的一个项目,我在Config::General的基础上编写了一个配置DSL。General支持一个项目的注释、注释和多个值

YAML和JSON广泛使用Perl以外的语言实现。Config::General仅适用于Perl


如果您可以安装模块,我建议无论您决定使用哪个模块,您都可以请求安装Config::General、YAML::XS、JSON或您喜欢的其他JSON模块。如果这是一个问题,那么在您的主目录或应用程序中安装Perl模块有很多解决方案。

好的,您需要成员。您能给出您试图获得的确切输出或数据结构吗?这不是设计的目的吗?这是您完全控制的应用程序的配置文件,还是您试图读入一些已经存在并正在用于其他用途的文件?如果是前者,您是否考虑过使用Config::General或YAML之类的工具?您是否意识到可以下载模块并在本地安装?通常只是更多的Perl代码文件。此外,配置文件的格式是否固定,或者,例如,大括号是否可以位于
label=
?hm.后面的行上。。您有45个
{
,只有43个
}
。某处缺少2x
}
检查:
grep-oc'\{'文件
我道歉。我原来的帖子是“编辑之间”。这篇不错
      IWM
      QQQ
      SPY
      SPY_TEST
A
AA
AAL
AAPL
ABT
ZNGA
ZNGA
      Bin_1
      Bin_2
      px.xisx.1
      px.xisx.2
      Bin_0
      Bin_99
      Bin_56
              AAPL
              ADY
              AEIS
              AFAM
              AGP
              ALNY
              ZINC
      Bin_0
      Bin_1
            px.xbox.1
            px.xbox.2
     A
     B
     C
     D
     E
     F
     G
     H
     I
     J
     K
     L
     M
     N
     O
     P
     Q
     R
          S
          T
          U
          V
           W
           X
           Y
           Z
use strict;
use warnings;
use autodie;

open my $fh, '<', 'penny_config.cfg';

while (<$fh>) {
  next unless /\S/;
  print unless /[#{}=]/;
}