in reply to checking array elements aginst another array

I would just go ahead and make this an explicit loop like below rather than messing with the do{} construction. Also your example just has letters. If that's what you really have instead of multi-character tokens, there is an easier way to do this with tr as shown below.
#!/usr/bin/perl -w use strict; $|=1; #autoflush so die comes out in right printout order #(after the prints) my @allowed = split '', 'abcdefghijklmno'; my %testHash; @testHash{@allowed}=(); my @test = split '', 'acbbedfydaccd'; #die "Unknown char! \n" unless exists $testHash{$_} for (@test); foreach (@test) { print "Unknown char! $_ \n" unless exists($testHash{$_}); } ####### another way ######### ###### use tr to count characters not in the set of allowed my $test = 'acbbedfydaccdy'; my $errors = $test =~ tr/abcdefghijklmno//c; print "\nerrors = $errors\n"; print "test=$test\n"; die "died Unknown character\n" if ( $test=~tr/abcdefghijklmno//c ); __END__ Unknown char! y errors = 2 test=acbbedfydaccdy # I added another y at end for testing died Unknown character