aboutsummaryrefslogtreecommitdiff
path: root/challenge-259/zapwai/perl/ch-2.pl
blob: c1a3acb15283d5596917ec3e64db30773afe4dc8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
use v5.38;
my $line1 = '{%  id   field1="value1"    field2="value2"  field3=42 %}';
my $line2 = '{%  youtube title="Title \"quoted\" done" foo="bar" baz=31 %}';
my $line3 = '{%  youtube title="Title with escaped backslash \\" %}';
my $line4 = '{% id field="val1" field2="val2" %}';
my $line5 = '{% test filed1="value1" df=42 %}';
my $line6 = 'LINES';
my $line7 = 'More Lines';
my $line8 = '{% endtest %}';

my %fv;
my %text;
my $current_id;

my @lines = ($line1, $line2, $line3, $line4, $line5, $line6, $line7, $line8);
proc($_) foreach (@lines);
say $fv{$current_id} unless ($text{$current_id});

sub proc ($line) {
    if ($line =~ /^{%/) {
	$line =~ /(\w+)/;
	if ($1 =~ /^end/) {
	    say $fv{$current_id};
	    say $text{$current_id};
	} else {
	    say $fv{$current_id} if ($current_id);
	    $current_id = $1;
	    process_line($line);
	}
    } else {
	$text{$current_id} = "Text => " unless ($text{$current_id});
	$text{$current_id} .= "$line\n";
    }
}

sub process_line ($line) {
    $line =~ /(\w+)/;
    my $name = $1;

    $line = substr $line, (index $line, $name) + length $name;
    $line = substr $line, 0, -3;
    $line =~ s/\s+/ /g;

    my ($r, $s) = get_fv($line);
    my @fields = @$r;
    my @values = @$s;
    my $output = "Name => $name\n";
    $output .= "Fields => {\n";
    $output .=  "\t".$fields[$_]." => ".$values[$_]."\n" for (0 .. $#fields);
    $output .=  "}\n";
    $fv{$current_id} = $output;
}

sub get_fv ($l) {
    my @piece = split "=", $l;
    my @field = ($piece[0]);
    my @value;
    for my $i (1 .. $#piece - 1) {
	$piece[$i] =~ /(\w+)$/;
	push @field, $1;
	my $strip = substr $piece[$i], 0, -length($1);
	push @value, $strip;
    }
    push @value, $piece[$#piece];
    s/\s+//g for (@field);
    return (\@field, \@value);
}