Кажется, это делает то, что вы хотите. Возможно, вы захотите добавить еще немного проверки ошибок.
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use List::Util 'sum';
my %value_map = load_value_map();
my $input = shift // '';
$input =~ s/[^ACGU]//g;
until ($input) {
print 'Give me a string of letters [ACGU]: ';
chomp ($input = <STDIN>);
$input =~ s/[^ACGU]//g;
}
my @values;
for (0 .. length($input) - 2) {
my $str = substr $input, $_, 2;
if (exists $value_map{$str}) {
push @values, $value_map{$str};
} else {
warn "$str is not a valid map key\n";
next;
}
}
say 'total value is ', sum(@values), ' (', join('+', @values), ')';
sub load_value_map {
open my $fh, '<', 'value.txt' or die $!;
my %value_map = map { chomp; split } <$fh>;
for (keys %value_map) {
if ($value_map{$_} =~ /\D+/) {
$value_map{$_} = $value_map{$value_map{$_}};
}
}
return %value_map;
}