my @stack; while () { if (/^\s+def (.*)/) { push @stack, ['def',$1]; print; } elsif (/^\s+if (.*)/) { push @stack, ['if',$1]; print; } elsif (/^\s+end/) { my $block = pop @stack; if ($block->[0] eq 'def') { print "*** definition of $block->[1] ended\n"; }; } else { # collect, or do something else print; }; };