我将这个脚本放在一起以获取成员括号内的内容。
这不是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
答案 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模块。