Für das Einlesen der Werte würde ich dir eher split() empfehlen anstatt reguläre Ausdrücke.
Für das Einlesen der Dateien kannst du dir auch eine schöne Subroutine bauen.
Dabei würde ich darauf achten, dass die Werte später einfach erreichbar sind.
Zum Beispiel Produkt und Status als einen key für einen Hash benutzen um einfacher vergleichen zu können.
Die Values der Hashes könnten vielleicht einmal einfache Skalare sein, für die Schwellwerte dann aber anon. Arrays.
Ein einfaches Beispielskript sähe so aus:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
 
#!/usr/bin/perl
use strict;
use warnings 'all';
use Data::Dumper;
# abfrage datei einlesen
my $data = &datei_lesen('abfrage.txt');
# schwellwerte datei einlesen
my $werte = &datei_lesen('schwellwerte.txt');
# daten vergleichen und anpassen
foreach my$key (keys %{$data})
{
    # roter bereich
    if ($data->{$key} > $werte->{$key}->[1])
    { $data->{$key} = 'rot' }
    # gelber bereich
    elsif ($data->{$key} > $werte->{$key}->[0])
    { $data->{$key} = 'gelb' }
    # gruener bereich
    else
    { $data->{$key} = 'gruen' }
}
# Ergebnisse Anzeigen
print Dumper($data);
# NAME:        datei_lesen()
# USE:        Datei anhand des musters in einen Hash einlesen.
# PARAMETERS:    Filename
# RETURNS:    Hash reference
sub datei_lesen($)
{
    # pick parameters
    my($file) = @_;
    # open file
    open(my$fhIN, '<', $file)
        or die "open failed: $!";
        # read data
        my %data;
        while (my$line=<$fhIN>)
        {
            chomp($line);
            # split line
            my @tracts = split(';', $line);
            # key results from product and status
            my $key = join(';', splice(@tracts, 0, 2));
            # maybe we have multiple values
            if ( @tracts > 1 )
            { $data{$key} = [@tracts]  }
            else
            { $data{$key} = $tracts[0] }
        }
    # close file
    close($fhIN);
    # return data reference
    return \%data;
} # datei_lesen
__END__
 
 
Müsste so, oder so ähnlich funktionieren.
Für die Ausgabe habe ich jetzt einfach Data::Dumper benutzt.
MfG