#!/usr/bin/perl -w use strict; my $tokens = { 'KEYWORD' => 'my', 'QSTRING' => '"(?:[^"]|\\")*"', 'VAR' => '\$\w+', 'SEMI' => ';', }; open(FH,"$ARGV[0]") || die("Error opening $ARGV[0]: $!\n"); undef $/; my $text = ; close(FH); my $lexer = &create_lexer($tokens); { my @token = &$lexer($text); last unless(defined($token[0])); print("Got: $token[0] => $token[1]\n") if(defined($$tokens{$token[0]})); redo; } sub create_lexer { my($tokens) = shift; my($sub,$code,$token,$key); foreach $key (keys(%$tokens)) { $code .= '$_[0] =~ s/\A\s*?(' . $$tokens{$key} . ')// '; $code .= "&& return('$key'," . '$1);' . "\n"; } $code .= '$_[0] =~ s/\A\s*?(\S)// && return("",$1);'; $code .= "return(undef,undef);\n"; $sub = eval("sub { $code } ") || die($@); return($sub); }