]> git.vpit.fr Git - perl/modules/Scope-Context.git/blob - samples/synopsis.pl
Initial commit
[perl/modules/Scope-Context.git] / samples / synopsis.pl
1 #!perl
2
3 use strict;
4 use warnings;
5
6 use blib;
7
8 use Scope::Context;
9
10 for my $run (1 .. 2) {
11  my @values = sub {
12   local $@;
13
14   eval {
15    # create Scope::Context objects
16    my ($block, $sub, $eval, $loop);
17    {
18     $block = Scope::Context->new;
19     $sub   = $block->sub;    # = $block->up
20     $eval  = $block->eval;   # = $block->up(2)
21     $loop  = $eval->up;      # = $block->up(3)
22    }
23
24    eval {
25     # This will throw an exception, since $block has expired.
26     $block->localize('$x' => 1);
27    };
28    print "Caught an error at run $run: $@" if $@;
29
30    # This prints "hello" when the eval block above ends.
31    $eval->reap(sub { print "End of eval scope at run $run\n" });
32
33    # Ignore $SIG{__DIE__} just for the loop.
34    $loop->localize_delete('%SIG', '__DIE__');
35
36    # Execute the callback as if it ran in place of the sub.
37    my @values = $sub->uplevel(sub {
38     return @_, 2;
39    }, 1);
40
41    # Immediately return (1, 2, 3) from the sub, bypassing the eval.
42    $sub->unwind(@values, 3);
43
44    # Not reached.
45    return 'XXX';
46   };
47
48   # Not reached.
49   die $@ if $@;
50  }->();
51
52  print "Values returned at run $run: @values\n";
53 }