There are modules on CPAN that can help you building a parser. For example, you can use
Marpa::R2 in the following way:
#!/usr/bin/perl
use warnings;
use strict;
use Marpa::R2;
my $dsl = << '__DSL__';
lexeme default = latm => 1
:default ::= action => ::first
Config ::= Assignment Config action => merge
| Assignment action => creat
+e_config
Assignment ::= Var (space equals space) Value (space) action => assig
+n
Value ::= number
| String
String ::= (quote) Quoteds (quote)
Quoteds ::= Quoted Quoteds action => conca
+t
| Quoted
Quoted ::= nonquote
| quotedquote action => quote
Var ::= Name
|| Array
Array ::= atsign Name Index action => name_
+index
Name ::= alpha alnum action => conca
+t
Index ::= (leftsquare) number (rightsquare)
space ~ [\s]*
alnum ~ [\w]+
alpha ~ [[:alpha:]]
atsign ~ '@'
equals ~ '='
leftsquare ~ '['
nonquote ~ [^']
number ~ [\d]+
quotedquote ~ '\'[']
quote ~ [']
rightsquare ~ ']'
__DSL__
sub concat { $_[1] . $_[2] }
sub name_index { [ $_[2], $_[3] ] }
sub quote { "'" }
sub assign { [ ref $_[1] ? @{ $_[1] } : $_[1], $_[2] ] }
sub merge {
my %config = %{ $_[-1] };
(2 == @{ $_[1] } ? $config{ $_[1][0] } : $config{ $_[1][0] }[ $_[1
+][1] ])
//= $_[1][-1];
return \%config
}
sub create_config {
my %config;
$config{ $_[1][0] }
= @{ $_[1] } == 2 ? $_[1][1]
: do {
my $ar = [];
$ar->[ $_[1][1] ] = $_[1][2];
$ar
};
\%config
}
my $grammar = 'Marpa::R2::Scanless::G'->new({source => \$dsl});
my $input = do { local $/; <DATA> };
my %config = %${ $grammar->parse(\$input, 'main') };
use Data::Dumper; print Dumper \%config
__DATA__
@arr[2] = 3
str = 'xyz'
@arr[2] = 5
str = 'abc\'d'
@arr[1] = '#+#:'
Output:
$VAR1 = {
'str' => 'abc\'d',
'arr' => [
undef,
'#+#:',
'5'
]
};
($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord
}map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,