If you are building this stuff at run time then some sort of decision tree is probably the best technique. I'd be inclined to use a nested hash. Consider:
use strict;
use warnings;
my $input = <<INPUT;
5600
5679
5700
INPUT
# Build the tree
my %tree;
while (<DATA>) {
chomp;
next unless length;
my ($number, $port) = split ',';
my @digits = split '', $number;
my $node = \%tree;
for my $digit (@digits) {
last if $digit eq '.';
if (exists $node->{$digit}) {
$node = $node->{$digit};
next;
}
$node = $node->{$digit} = {};
}
$node->{port} = $port;
}
# Process input numbers
open my $inFile, '<', \$input or die "Failed to open input file: $!";
while (defined (my $number = <$inFile>)) {
chomp $number;
my @digits = split '', $number;
my $node = \%tree;
for my $digit (@digits) {
last unless exists $node->{$digit};
$node = $node->{$digit};
}
print "$number---port$node->{port}\n";
}
__DATA__
56..,1
567.,2
5...,x
Prints:
5600---port1
5679---port2
5700---portx
Perl's payment curve coincides with its learning curve.
|