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

时间:2014-07-31 16:02:00

标签: perl parsing

我将这个脚本放在一起以获取成员括号内的内容。

这不是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";
   }
}

这是配置文件

# Tick Size
# tr -d \  | sort -u
TickSizePostOpen = 1.00
TickSize = {
  penny1 = {
    TickSize = 0.00
    members = {
      IWM
      QQQ
      SPY
      SPY_TEST
    }
  }
  penny = {
    TickSize = </0.000/0.00/0.00
    members = {
A
AA
AAL
AAPL
ABT
ABT_SPIN
ZNGA
    }
  }
  notpenny = {
    TickSize = </9/9.99/9.99
  }
}
BIPP.QuoterOx = {
  Cup1and2 = {
    BIPP.QuoterOx = BIPP-ox-1
    members = {
      Cup_1
      Cup_2
    }
  }
TRAP.PxByGroup = 1
TRAP.Px = {
  group1 = {
    TRAP.Px = OPTxxxxxx
    members = {
      px.TRAP.1
    }
  }
  group2 = {
    TRAP.Px = OPTxxxxxx
    members = {
      px.TRAP.2
    }
  }
TRAP.QuoterOx = {
  Cup0 = {
    TRAP.QuoterOx = QESxxxxx
    members = {
      Cup_0
      Cup_99
    }
  }
  Cup1and4and10 = {
    TRAP.QuoterOx = ise-ox-1-4-10-dti
    members = {
      Cup_1
      Cup_4
      Cup_10
    }
  }
Cup56 = {
    TRAP.AuctionOx = ise-ox-56-ecl
    members = {
      Cup_56
    }
  }
}
TRAP.RotateQuote = {
  rotatenames = {
    TRAP.RotateQuote = 1
      members = {
              AAPL
              ADY
              AEIS
              AFAM
              AGP
              ALNY
              ZINC
      }
  }
}
Underlying = {
  Cup0 = {
    Underlying = MHR
    members = {
      Cup_0
    }
  }
  g1 = {
    Underlying = CEL
    members = {
      Cup_1
    }
  }
}
BIPP.Px = {
    group1 = {
        BIPP.Px = BOXPXMHR1
        members = {
            px.BIPP.1
        }
    }
    group2 = {
        BIPP.Px = BOXPXMHR2
        members = {
            px.BIPP.2
        }
    }
}
TWIG.Px = {
   AB = {
   TWIG.Px = TWIGPXMHR1
   members = {
     A
     B
   }
 }
   CD = {
   TWIG.Px = TWIGPXMHR2
   members = {
     C
     D
   }
 }
   NOPQR = {
   TWIG.Px = TWIGPXMHR6
   members = {
     N
     O
     P
     Q
     R
   }
 }
   STUV = {
   TWIG.Px = TWIGPXMHR7
       members = {
          S
          T
          U
          V
       }
   }
   WXYZ = {
   TWIG.Px = TWIGPXMHR8
       members = {
           W
           X
           Y
           Z
       }
   }
}

我得到的结果是:

      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

2 个答案:

答案 0 :(得分:1)

您所写的内容只是从原始文件中删除注释和字段名称。没有必要这么做了。

该程序产生相同的输出

use strict;
use warnings;
use autodie;

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

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

答案 1 :(得分:0)

有人已经评论过你应该看看Config :: General或YAML。你应该看看Config :: General和YAML。

YAML兼容JSON,但提供的功能多于JSON。由于您的数据看起来有点像JSON,因此将其转换为JSON将允许您使用现有的JSON或YAML工具来解释它。

Config :: General是在Apache配置文件格式之后建模的,并且具有比YAML更好的功能集。一旦您熟悉Config :: General,就可以像JSON一样将数据迁移到它。对于我的一个项目,我在Config :: General上编写了一个配置DSL。 Config :: General支持项目的Comments,HereDocs和多个值。

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

如果您可以安装模块,我建议您无论您决定使用哪个模块,都要求安装Config :: General,YAML :: XS,JSON和/或您喜欢的任何备用JSON模块。如果这是一个问题,可以在主目录或应用程序中安装Perl模块。