in reply to extract content for nested pattern in a file
Can't be simper! Just write a parser for the input format.
(I had to add the missing double quotes at lines 14 and 38.)
#!/usr/bin/perl use warnings; use strict; use feature qw{ say }; use Marpa::R2; my $dsl = << '__DSL__'; :default ::= action => ::first lexeme default = latm => 1 Block ::= Outer Block action => append | Outer Outer ::= Header Body (semi2) action => keyval || Header Body action => keyval Header ::= varname (rpar) Body ::= Assignment action => expand | Assignment Body action => append | Inner | Inner Body action => append | (Garbage) action => [] | (Garbage) Body InBody ::= Assignment action => expand | Assignment InBody action => append | (Garbage) action => [] | (Garbage) InBody Assignment ::= varname (eq) Quoted action => assign Quoted ::= (quote) string (quote) action => quoted Inner ::= Header InBody (semi2) action => keyval Garbage ::= Cat | Case | Esac | Echo Cat ::= cat path | cat path semi1 Case ::= case What in Esac ::= esac Echo ::= echo Quoted What ::= varname | bq varname bq :discard ~ whitespace whitespace ~ [\s]+ varname ~ [\w]+ string ~ [\w.$/\\]+ quote ~ '"' semi1 ~ ';' semi2 ~ ';;' eq ~ '=' rpar ~ ')' path ~ [\w/]+ cat ~ 'cat' case ~ 'case' in ~ 'in' bq ~ '`' esac ~ 'esac' echo ~ 'echo' __DSL__ sub quoted { qq("$_[1]") } sub assign { [ @_[1, 2] ] } sub append { [ $_[1], 'ARRAY' eq ref $_[2] ? @{ $_[2] } : $_[2] ] } sub keyval { +{ $_[1] => $_[2] } } sub expand { [ $_[1] ] } sub addkey { +{ %{ $_[1] }, %{ $_[2] } } } my $grammar = 'Marpa::R2::Scanless::G'->new({ source => \$dsl }); open my $IN, '<', shift or die $!; my $input = do { local $/; <$IN> }; my $parsed = ${ $grammar->parse(\$input, 'main') }; for my $h (@$parsed) { my $key = (keys %$h)[0]; for my $val (@{ $h->{$key} }) { { ARRAY => sub { say join ': ', $key, join '=', @$val }, HASH => sub { output_hash($key, $val) }, }->{ ref $val }->(); } } sub output_hash { my ($key, $val) = @_; say for map { join ': ', $key, $_ } map { my $k = $_; map { "$k: " . join '=', @$_ } @{ $val->{$k} } } keys %$val; }
($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,
|
---|