1
2
3
4
5
6
7
8
9
10
11
foreach $fileLineZF(<ZFFILE>)
{
if(#irgendeine RegEx)
{
#mein Code
}
elsif(#irgendeine RegEx)
{
#Ich möchte hier nun mit der bisher erreichen Zeile der foreach-Schleife und einer while-schleife weitermachen.
}
}
2014-08-04T12:38:54 bandchefCode: (dl )1
2
3
4
5
6
7
8
9
10
11foreach $fileLineZF(<ZFFILE>)
{
if(#irgendeine RegEx)
{
#mein Code
}
elsif(#irgendeine RegEx)
{
#Ich möchte hier nun mit der bisher erreichen Zeile der foreach-Schleife und einer while-schleife weitermachen.
}
}
Wie kann ich im elsif mit einer while-Schleife, welche als Bedingung eine weitere RegEx bekommt, weitermachen? Die while-Schleife soll als Startwert die nächste Zeile der vorherigen foreach-Schleife bekommen.
1 2 3 4 5 6 7 8 9
while (my $line = <ZFILE>) { if ($line =~ /.../) { ...; } elsif ($line =~ /.../) { while ($line = <ZFILE>) { ...; } } }
2014-08-04T13:04:29 clmsDie Semantik von foreach bedeutet, dass der ganze File auf einen Schlag in ein Array gelesen wird, dass dann anschließend abgearbeitet wird. (In der Praxis optimiert Perl hier AFAIK normalerweise, so dass der File doch nur zeilenweise gelesen wird)
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
while($fileLineZF = <ZFFILE>)
{
if(($fileLineZF =~ /^F\s+.*FktTyp=CopTel\s+DBus=(\S+)\s+DTel=$DestID\s+Snd=Y\s*$/)) #check CopTel-Messages
{
print $fileLineZF;
$zfCounterFound++;
$DBusZF = $1;
#$zfCounterFound = 0;
if($DBusZF eq "D_CAN") #D-CAN
{
#print "TEST: $DBusZF\n";
$numOfMessages_DCAN_CAN1 += 50;
}
elsif($DBusZF eq "Body-CAN") #Body-CAN
{
#print "TEST: $DBusZF\n";
$numOfMessages_BodyCAN_CAN2 += 50;
}
elsif($DBusZF eq "Body2-CAN") #Body2-CAN
{
#print "TEST: $DBusZF\n";
$numOfMessages_Body2CAN_CAN3 += 50;
}
elsif($DBusZF eq "FA-CAN") #FA-CAN
{
#print "TEST: $DBusZF\n";
$numOfMessages_FACAN_CAN4 += 50;
}
elsif($DBusZF eq "IuK-CAN") #IUK-CAN
{
#print "TEST: $DBusZF\n";
$numOfMessages_IUKCAN_CAN5 += 50;
}
elsif($DBusZF eq "ZSG-CAN") #ZSG-CAN
{
#print "TEST: $DBusZF\n";
$numOfMessages_ZSGCAN_CAN6 += 50;
}
}
elsif($fileLineZF =~ /^F\s+.*FktTyp=CopSig\s+DBus=(\S+)\s+DTel=(\d+)\s+Snd=Y\s*$/) #Check CopSig-Messages
{
#Konzept:
#Zeilen-Pointer übernehmen und so lange weiterzählen lassen, bis wir auf eine
#neue Zeile stoßen, oder das DTel nicht mehr mit den vorhergegangen DTels übereinstimmt.
#Wenn neue Zeile kommt und alle DTels bis dahin gleich waren, dann die Nachricht zählen;
#ansonsten abbrechen
$predDTel = $2;
next;
while($fileLineZF = <ZFFILE>)
{
$fileLineZF =~ /^F\s+.*FktTyp=CopSig\s+DBus=(\S+)\s+DTel=(\d+)\s+Snd=Y\s*$/
$currDTel = $2
if(predDtel eq currDTel)
}
}
}
1 2 3 4 5
# weiter oben: my %numOfMessages; ... #print "TEST: $DBusZF\n"; $numOfMessages{ $DBusZF } += 50;