in reply to using strict

It has all to do with scoping. my declares a variable for the current scope. Basicly, a scope is a part of code between { and }. Or at least, that is how I understand it. Please, monks, correct me if I'm wrong.

But, with this information, it's pretty clear why your code is not working:
... if (/^##recstart/) { my ($junk,$recno) = split; # $recno declared for this block $recno =~ s/'//g; } elsif (/^##v/) { my ($junk,$qno,$junk2,$vtext) = split (/ /,$_,4); # both $qno and $vtext declared for this block $qno =~ s/'//g; $vtext =~ s/'//g; } else { # nothing declared at all for this else block print OUT "$recno^$qno^$vtext"; } }