There is a lot you can do to make your code better, as shown below. Note that this will not make your code faster.
- Localize your variables (using my).
- Localize file handles too, after making them lexicals. (Now that they're scoped, close is no longer needed.)
- Use strict to make sure your variables are localized.
- Use warnings to detect errors.
- Don't open four files when you only need to open one or two.
- Indent properly.
- Use the safer 3-arg open.
- Don't hardcode the area codes.
- Don't use regexp to search for strings. Use index for a great speed boost.
use strict;
use warnings;
use File::Spec qw( );
use IO::Dir qw( );
my $dir = 'E:\\Documents and Settings\\ebrine';
my $cell = File::Spec->catfile($dir, 'Cell.txt');
my %area_codes = map { /(\d+)/; $1 => File::Spec->catfile($dir, $_) }
grep /^\d+\.txt\z/i,
IO::Dir->new($dir)->read();
my $num;
... Tk code ...
sub search {
my $found = 0;
my @number = split(/-/, $num);
my $search_text = join '', @number;
my $file = $area_codes{$num[0]};
if (defined $file) {
open(my $fh, '<', $file)
or die("Unable to open file for areacode $num[0]: $!\n");
$found = search_file($fh, $search_text);
}
if (not $found) {
open(my $fh, '<', $cell)
or die("Unable to open file for cellphones: $!\n");
$found = search_file($fh, $search_text);
}
... Show results ...
}
sub search_file {
my ($fh, $search_text) = @_;
while (<$fh>) {
return 1 if index($_, $search_text) >= 0;
... Update ticker ...
}
return;
}