Commit | Line | Data |
---|---|---|
b6955321 JM |
1 | package reader; |
2 | use feature qw(switch); | |
3 | use strict; | |
4 | use warnings; | |
5 | use Exporter 'import'; | |
6 | ||
b6955321 JM |
7 | |
8 | { | |
9 | package Env; | |
89bd4de1 | 10 | use Data::Dumper; |
b6955321 JM |
11 | sub new { |
12 | my ($class,$outer,$binds,$exprs) = @_; | |
13 | my $data = { __outer__ => $outer }; | |
a5a66058 | 14 | if ($binds) { |
89bd4de1 JM |
15 | for (my $i=0; $i<scalar(@{$binds->{val}}); $i++) { |
16 | if (${$binds->nth($i)} eq "&") { | |
a5a66058 | 17 | # variable length arguments |
89bd4de1 | 18 | my @earr = @{$exprs->{val}}; # get the array |
a5a66058 | 19 | my @new_arr = @earr[$i..$#earr]; # slice it |
89bd4de1 | 20 | $data->{${$binds->nth($i+1)}} = List->new(\@new_arr); |
a5a66058 JM |
21 | last; |
22 | } else { | |
89bd4de1 | 23 | $data->{${$binds->nth($i)}} = $exprs->nth($i); |
a5a66058 JM |
24 | } |
25 | } | |
26 | } | |
b6955321 JM |
27 | bless $data => $class |
28 | } | |
29 | sub find { | |
30 | my ($self, $key) = @_; | |
b8ee29b2 | 31 | if (exists $self->{$$key}) { return $self; } |
b6955321 JM |
32 | elsif ($self->{__outer__}) { return $self->{__outer__}->find($key); } |
33 | else { return undef; } | |
34 | } | |
35 | sub set { | |
36 | my ($self, $key, $value) = @_; | |
b8ee29b2 | 37 | $self->{$$key} = $value; |
b6955321 JM |
38 | return $value |
39 | } | |
40 | sub get { | |
41 | my ($self, $key) = @_; | |
42 | my $env = $self->find($key); | |
b8ee29b2 JM |
43 | die "'" . $$key . "' not found\n" unless $env; |
44 | return $env->{$$key}; | |
b6955321 JM |
45 | } |
46 | } | |
47 | ||
48 | #my $e1 = Env->new(); | |
49 | #print Dumper($e1); | |
50 | # | |
51 | #my $e2 = Env->new(); | |
52 | #$e2->set('abc', 123); | |
53 | #$e2->set('def', 456); | |
54 | #print Dumper($e2); | |
55 | # | |
56 | #my $e3 = Env->new($e2); | |
57 | #$e3->set('abc', 789); | |
58 | #$e3->set('ghi', 1024); | |
59 | #print Dumper($e3); | |
60 | # | |
61 | #print Dumper($e3->find('abc')); | |
62 | #print Dumper($e3->get('abc')); | |
63 | #print Dumper($e3->find('def')); | |
64 | #print Dumper($e3->get('def')); | |
65 | ||
66 | 1; |