note
themage
Hi,
<br><br>
I build a small parser to create your perl structure from your file. A part of this is a escape function, that would escape special chars in s///.
<br><br>
The parsing is done specially by the <b>parse</b>.
<br><br>
<code>
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
sub escape {
my $str=shift;
$str=~s/\\/\\\\/g;
$str=~s/\[/\\[/g;
$str=~s/\]/\\]/g;
$str=~s/\(/\\(/g;
$str=~s/\)/\\)/g;
$str=~s/\{/\\{/g;
$str=~s/\}/\\}/g;
$str=~s/\^/\\^/g;
$str=~s/\//\\\//g;
$str=~s/\+/\\\+/g;
$str=~s/\-/\\\-/g;
$str=~s/\$/\\\$/g;
$str=~s/\&/\\\&/g;
$str=~s/\*/\\\*/g;
$str=~s/\|/\\\|/g;
$str=~s/\?/\\\?/g;
return $str;
};
sub parseoptions {
my $options=shift;
my @opts=();
$options=~s/\s+$//;
for my $opt (split /\n/, $options) {
$opt=~/^\s*(\w+)\s+(.*)$/;
my $data={name=>$1, content=>$2};
unshift @opts, $data;
}
return \@opts;
}
sub parse {
my $lookat=shift;
my @struct=();
while ($$lookat=~/^\s*(\w+)\s+(\w+)?\s*{/) {
my $data={type=>$1,name=>$2};
my $str=escape($&);
$$lookat=~s/^$str//;
if ($$lookat=~/^[^}]+{/) {
$data->{content}=parse($lookat);
$$lookat=~s/^\s*}//;
} else {
($data->{content})=$$lookat=~/^\s*([^}]+)\s*}/;
my $str=escape($&);
$$lookat=~s/^$str//;
if ($data->{type} eq 'single') {
$data->{content}=parseoptions($data->{content}); }
}
unshift @struct, $data;
}
return \@struct;
}
my $quest="";
while (my $line=<>) {
$line=~s/^\s+/ /g;
$quest.=$line;
}
my $struct=parse(\$quest);
print Dumper($struct);
</code>
<br><br>
Hope this helps.
<br><br>
<!-- Node text goes above. Div tags should contain sig only -->
<div class="pmsig"><div class="pmsig-273763">
TheMage<br>
[http://themage.bliker.com]
</div></div>
473596
473596