while () { if (/foo/) { print "Found 'foo'\n"; }; if (/bar/) { print "Found 'bar'\n"; }; if (/baz/) { print "Found 'baz'\n"; }; print "Unknown line: $_"; }; __DATA__ foozle bazzle barren #### my @items =( sub { /foo/ and do { print "Found 'foo'\n"; }}, sub { /bar/ and do { print "Found 'bar'\n"; }}, sub { /baz/ and do { print "Found 'baz'\n"; }}, sub { print "Unknown line: $_"; undef }, ); my @current = @items; while (defined (my $line = )) { my @remaining = @current; @current = (); local $_ = $line; CODE: while (my $c = shift @remaining) { if ($c->()) { push @current, @remaining; last # CODE } else { push @current, $c; }; }; }; __DATA__ foozle --- #1 bazzle --- #2 barren --- #3