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