Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]9034[/thread]

Subroutinen zusammenlegen



<< >> 8 Einträge, 1 Seite
leissi
 2007-05-25 10:47
#76913 #76913
User since
2005-07-06
84 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich habe drei Subroutinen die drei verschiedene Dateien prüfen. Da die die Subroutinen identisch sind, möchte ich diese zusammenlegen. Frage wie kann ich sowas machen!

Hier ein Ausschnitt:
Code: (dl )
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
71
72
73
74
  sub ResetQcDemoPJ 
{
my $ResetQcDemoPJ = 0;

# Hier wird das verzeichnis geöffnet und geprüft ob gesuchte Datei im Verzeichnis liegt.
my $DateiName = $DateiName;
my $verzeichnis = $SqlSrvJobs;
if (existsFileInDirectory($DateiName, $verzeichnis))
{

print LogDatei '#' x 120, "\n";
print LogDatei '#' x 120, "\n";
print LogDatei "Die Datei: $DateiName wurde im Verzeichnis: $verzeichnis gefunden!\n";

# Hier wird die Datei auf aktuelles Datum geprüft. Ergebnis wird dann ausgegeben.
print LogDatei ("INFO : ","Der Zeitstempel der Datei wird geprüft!\n");


my $dir = $SqlSrvJobs;
opendir(DIR,$dir) or die $!; # Verzeichnis "öffnen"
my @verzeichnisse = grep{-f $dir .'/'.$_}readdir(DIR);
my $file = $SqlSrvJobs2;
if(existsTimeStamp($file,24))

{
# Wenn Datei im Verzeichnis vorhanden, dann prüfen ob Suchstring in der Datei enthalten ist.
print LogDatei "Die Datei: " . $file . " wurde im Verzeichnis gefunden und hat ein aktuelles Datum!\n";
print LogDatei '+' x 120, "\n";
print LogDatei "Die Datei: " . $file . " wird gelesen und geprüft!\n";
my $file = $SqlSrvJobs2;
my $String = $String1;

if (existsFileString ($file, $String))
{

print LogDatei "Der Suchstring in der Datei wurde gefunden!! \n";
print LogDatei '+' x 120, "\n";
$ResetQcDemoPJ = 1;

}
else
{

print LogDatei "Der Suchstring in der Datei wurde nicht gefunden!! \n";
$ResetQcDemoPJ = 0;
}
}
else
{
print LogDatei "Es besteht in dem Verzeichnis keine aktuelle Datei!\n";
$ResetQcDemoPJ = 0;
}


}
else
{
$ResetQcDemoPJ = 0;
print LogDatei "Die Datei: $DateiName1 wurde im Verzeichnis: $verzeichnis nicht gefunden!\n";
}
## Hier wird nach Durchlauf der Kontrolle ein Statment abgegeben wenn keine aktuellen Dateien vorhanden sind!
unless($ResetQcDemoPJ)
{
print LogDatei "Prüfung abgebrochen, da eine der Prüfungen nicht OK war!! Bitte prüfen!!!\n";
}
print LogDatei "$ResetQcDemoPJ";
return $ResetQcDemoPJ # Hier wird der ermittelte Rückgabewert aus der Subroutine übergeben!





} # End of: sub DATEI CHECK
#close ResetQcDemoPJ

Die beiden nächsten sind komplett identisch. Ich wollte dies durch eine while Schleife machen aber irgendwie hat das nicht geklappt.
Gruss

Leissi
pktm
 2007-05-25 11:21
#76914 #76914
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hm, das ist interessant. Generell solltest du jede Sub nur einmal schreiben müssen :)
Eventuell müsstest du die Schnittstelle zu deinem Hauptprogramm ordentlich gestalten um die Sub mehrfach verwenden zu können.
Woher kommt der Wert für die Zuweisung my $DateiName = $DateiName;? Der wird doch bestimmt aus deinem Hauptprogramm genommen oder?
Den müsstest du irgendwie als Parameter deiner Sub einführen.

Ein Beispiel:
Code: (dl )
1
2
3
4
5
6
7
8
my $sub bla {
my $parameter1 = shift;
my $parameter2 = shift;
my $ergebnis = 'voreingestellter Wert oder sowas in der Art';
# mach was...

return $ergebnis;
}


Dadurch, dass du die Schnittselle, also das was in die Sub rein und raus kommt ordentlich definierst kannst du die Methode auch schön in einer Schleife mit unterschiedlichen Werten verwenden:
Code: (dl )
1
2
3
4
5
foreach my $param1 ( @p1 ) {
foreach my $param2 ( @p2 ) {
my $ergebnis = bla(param1, $param2);
}
}


Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
vayu
 2007-05-25 11:22
#76915 #76915
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
aber du musst doch die 3 subroutinen eh schon irgendwo aufrufen ... ersetz halt einfach die namen der 2 andern subs durch den der ersten.
bloonix
 2007-05-25 11:23
#76916 #76916
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Vorschau geklickt und gesehen... ptkm war schneller :)
aber ich geb trotzdem nochmal was dazu...

rein fürs Verständnis: Perldoc:Perldoc->perlsub\n\n

<!--EDIT|opi|1180077850-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
leissi
 2007-05-25 11:28
#76917 #76917
User since
2005-07-06
84 Artikel
BenutzerIn
[default_avatar]
He,

Ihr seid unschlagbar. Danke
Zitat von ptkm: Woher kommt der Wert für die Zuweisung my $DateiName = $DateiName;? Der wird doch bestimmt aus deinem Hauptprogramm genommen oder?

Ja da hast Du recht die holt er sich aus einem Hauptprogramm wo die Parameter definiert sind.

Ich werde jetzt mal das umsetzen.
Also vielen vielen Dank. Wenn ich nicht klar komme melde ich mich noch mal.

Gruss

Leissi
leissi
 2007-05-25 13:48
#76918 #76918
User since
2005-07-06
84 Artikel
BenutzerIn
[default_avatar]
Hallo,

also irgenwie hat es mich verlassen, bekomm es nicht in die Reihe hiermal das Script etwas länger:

Code: (dl )
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#Hauptprogramm Aufruf der einzelnen Sub_Routinen
# Subroutinenaufruf der Prüfroutinen mit Rückgabewert ob Check OK oder NOK
# Hier wird aus den einzelnen Prüfungen, die Ergebnisse übergeben und ausgewertet


my $ReturnCode1 = &ResetQcDemoPJ;
my $ReturnCode2 = &QcDemoPjRepository;
my $ReturnCode3 = &Sqlrmi;
my $ReturnCode4 = &SnapshotLics;
my $pfgErgebnis1;

print LogDatei "$ReturnCode1";
# Hier wird das Ergebnis ausgewertet


if (($ReturnCode1 == 1) && ($ReturnCode2 == 1 ) && ($ReturnCode3 == 1) && ($ReturnCode4 == 1))
{
my $returnCode = sendMail("1");
# Gesamtergebnis positiv
print LogDatei '#' x 120, "\n";
print LogDatei ("INFO: ", "Die Z3S BackupKontrolle war erfolgreich!\n");

}
else
{
my $returnCode = sendMail("0");
# Gesamtergebnis negativ
print LogDatei '#' x 120, "\n";
print LogDatei ("ERROR", "Die Z3S BackupKontrolle war nicht erfolgreich! \n");


if ( $ReturnCode1 == 0)
{
print LogDatei ("ERROR: ", "Existenz aktueller reset_QcDemoPj.log: NOK\n");
}
else
{
print LogDatei ("INFO: ", "Existenz aktueller reset_QcDemoPj.log: OK\n");
}
if ( $ReturnCode2 == 0)
{
print LogDatei ("ERROR: ","Existenz aktueller Datei: reset_QcDemoPjRepository.log: NOK\n");
}
else
{
print LogDatei ("INFO: ","Existenz aktueller Datei: reset_QcDemoPjRepository.log: OK\n");
}
if ( $ReturnCode3 == 0)
{
print LogDatei ("ERROR: ","Existenz aktueller Datei: SQLRMI_SV040488_run_out.txt: NOK\n");
}
else
{
print LogDatei ("INFO: ","Existenz aktueller Datei: SQLRMI_SV040488_run_out.txt: OK\n");
}
if ( $ReturnCode4 == 0)
{
print LogDatei ("ERROR: ","Existenz aktueller Datei: SnapshotLics.log: NOK\n");
}
else
{
print LogDatei ("INFO: ","Existenz aktueller Datei: SnapshotLics.log: OK\n");
}



}


####################################################################################################################################################



#####################################################################################################################
#####################################################################################################################
#Datei reset_QcDemoPJ.log wird geprüft
#Hier wird die Datei in drei Einzelschritten geprüft. Die Prüfungen sind in Subroutinen ausgelagert.

sub ResetQcDemoPJ
{
my $ResetQcDemoPJ = 0;

# Hier wird das verzeichnis geöffnet und geprüft ob gesuchte Datei im Verzeichnis liegt.
my $DateiName = $DateiName;
my $verzeichnis = $SqlSrvJobs;
if (existsFileInDirectory($DateiName, $verzeichnis))
{

print LogDatei '#' x 120, "\n";
print LogDatei '#' x 120, "\n";
print LogDatei "Die Datei: $DateiName wurde im Verzeichnis: $verzeichnis gefunden!\n";

# Hier wird die Datei auf aktuelles Datum geprüft. Ergebnis wird dann ausgegeben.
print LogDatei ("INFO : ","Der Zeitstempel der Datei wird geprüft!\n");


my $dir = $SqlSrvJobs;
opendir(DIR,$dir) or die $!; # Verzeichnis "öffnen"
my @verzeichnisse = grep{-f $dir .'/'.$_}readdir(DIR);
my $file = $SqlSrvJobs2;
if(existsTimeStamp($file,24))

{
# Wenn Datei im Verzeichnis vorhanden, dann prüfen ob Suchstring in der Datei enthalten ist.
print LogDatei "Die Datei: " . $file . " wurde im Verzeichnis gefunden und hat ein aktuelles Datum!\n";
print LogDatei '+' x 120, "\n";
print LogDatei "Die Datei: " . $file . " wird gelesen und geprüft!\n";
my $file = $SqlSrvJobs2;
my $String = $String1;

if (existsFileString ($file, $String))
{

print LogDatei "Der Suchstring in der Datei wurde gefunden!! \n";
print LogDatei '+' x 120, "\n";
$ResetQcDemoPJ = 1;

}
else
{

print LogDatei "Der Suchstring in der Datei wurde nicht gefunden!! \n";
$ResetQcDemoPJ = 0;
}
}
else
{
print LogDatei "Es besteht in dem Verzeichnis keine aktuelle Datei!\n";
$ResetQcDemoPJ = 0;
}


}
else
{
$ResetQcDemoPJ = 0;
print LogDatei "Die Datei: $DateiName1 wurde im Verzeichnis: $verzeichnis nicht gefunden!\n";
}
## Hier wird nach Durchlauf der Kontrolle ein Statment abgegeben wenn keine aktuellen Dateien vorhanden sind!
unless($ResetQcDemoPJ)
{
print LogDatei "Prüfung abgebrochen, da eine der Prüfungen nicht OK war!! Bitte prüfen!!!\n";
}

return $ResetQcDemoPJ # Hier wird der ermittelte Rückgabewert aus der Subroutine übergeben!





} # End of: sub DATEI CHECK
#close ResetQcDemoPJ
####################################################################################################################################


$DateiName = $DateiName; hier wird ein Parameter übergeben und zwar aus einer main.ini Datei

Gruss

Leissi
PerlProfi
 2007-05-25 14:58
#76919 #76919
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Was genau bekommst du denn jetzt nicht hin ?
So wie ich das sehe braucht deine Sub ResetQcDemoPJ() 5 Parameter.
Solange die Variablen, die du noch nicht als Parameter übergibst, nicht getie()d sind, könnte sie so aussehen:
Code: (dl )
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
sub ResetQcDemoPJ($$$$$)
{
# pick parameters
my($fhlog, $dir, $file1, $file2, $string) = @_;

# return code
my $rc = 0;

# Hier wird das verzeichnis geöffnet und geprüft ob gesuchte Datei im Verzeichnis liegt.
if (existsFileInDirectory($file1, $dir))
{
print {$fhlog} '#' x 120, "\n";
print {$fhlog} '#' x 120, "\n";
print {$fhlog} "Die Datei: $file1 wurde im Verzeichnis: $dir gefunden!\n";

# Hier wird die Datei auf aktuelles Datum geprüft. Ergebnis wird dann ausgegeben.
print {$fhlog} ("INFO : ","Der Zeitstempel der Datei wird geprüft!\n");


opendir(my$dhdir, $dir) or die "$dir: $!"; # Verzeichnis "öffnen"
my @verzeichnisse = grep{ -f qq($dir/$_) } readdir($dhdir);
closedir($dhdir);

if (existsTimeStamp($file2, 24))
{
# Wenn Datei im Verzeichnis vorhanden, dann prüfen ob Suchstring in der Datei enthalten ist.
print {$fhlog} "Die Datei: " . $file2 . " wurde im Verzeichnis gefunden und hat ein aktuelles Datum!\n";
print {$fhlog} '+' x 120, "\n";
print {$fhlog} "Die Datei: " . $file2 . " wird gelesen und geprüft!\n";

if (existsFileString($file2, $string))
{

print {$fhlog} "Der Suchstring in der Datei wurde gefunden!! \n";

print {$fhlog} '+' x 120, "\n";

$rc = 1;
}
else
{

print {$fhlog} "Der Suchstring in der Datei wurde nicht gefunden!! \n";

$rc = 0;
}
}
else
{
print {$fhlog} "Es besteht in dem Verzeichnis keine aktuelle Datei!\n";
$rc = 0;
}
}
else
{
$rc = 0;
print {$fhlog} "Die Datei: $file1 wurde im Verzeichnis: $dir nicht gefunden!\n";
}

## Hier wird nach Durchlauf der Kontrolle ein Statment abgegeben wenn keine aktuellen Dateien vorhanden sind!
unless ($rc)
{
print {$fhlog} "Prüfung abgebrochen, da eine der Prüfungen nicht OK war!! Bitte prüfen!!!\n";
}

return $rc; # Hier wird der ermittelte Rückgabewert aus der Subroutine übergeben!
} #close ResetQcDemoPJ

Ich hab noch ein closedir() mit eingefügt und $DateiName1 in $DateiName ersetzt, in der Ausgabe falls die DAtei nicht gefunden wird.

Aufrufen kannst du die Subroutine dann folgendermaßen:
Code: (dl )
my $rc = ResetQcDemoPJ(\*LogDatei, $SqlSrvJobs, $DateiName, $SqlSrvJobs2, $String1);


MfG
leissi
 2007-05-25 17:39
#76920 #76920
User since
2005-07-06
84 Artikel
BenutzerIn
[default_avatar]
:) Hallo

Vielen Dank PerlProfi nun habe ich es verstanden und juppi es läuft. Ich hatte ein großes Problem zu verstehen das ich die entsprechenden Parameter nur nach der Reihenfolge übergeben muss und siehe da habs begriffen.
Nachdem ich den Code überarbeitet habe, habe ich den getéstet und es kommt tatsächlich für jede Prüfung explizit ein erwartetes Ergebnis.

Ich stand echt auf dem Schlauch.

Vielen Dank nochmals an alle.
<< >> 8 Einträge, 1 Seite



View all threads created 2007-05-25 10:47.