Schrift
[thread]12287[/thread]

Funktion sub write_log universal gestalten

Leser: 1


<< >> 9 Einträge, 1 Seite
Duff
 2008-08-01 18:11
#113001 #113001
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Hallo,

und schon wieder eine neue Frage ;-)

Ich möchte mit einer Funktion sub write_log { ... } für verschiedene andere Funktionen gerne bestimmte Werte in ein Logfile schreiben.

Bisher sieht meine Funktion so aus:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
sub write_log {
   my $id=shift;
   my $value=shift;
   print "$value\n";
   die "Der Identifier ist außerhalb des Gültigkeitsbereichs\n" if($id != 1 and $id != 2 and $id != 3);

   open(LOG, '>>', $LOGFILE) or die "$LOGFILE: open(rw) failed: $!\n";
   print LOG "-"x60,"\n"   if($id == 1);
   print LOG "$value\n"    if($id == 1) ;
   printf LOG $value       if($id == 2);
   printf LOG "$value\n"   if($id == 3);
   close(LOG);

} # End write_log


Anhand eines Identifiers soll unterschieden werden, wie der Logeintrag aussehen soll.

1 => Überschrift für ein Thema (Quota's)
2 => Überschrift für ein Unterthema (Benutzername, Prozentzahl)
3 => Logging der eigentlichen Werte

Nur wie kann ich jetzt der Funktion z.B. einen String so übergeben, dass dort dann sinngemäß sowas stehen würde:
Code (perl): (dl )
printf LOG ("%-16s : %-120s\n", "Benutzername", "Genutze Quota's in %") if($id == 2);
D'OH
Daniel
MatthiasW
 2008-08-01 22:47
#113009 #113009
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Naja, wie wäre es mit mehr als nur einem Parameter?
Einer fürs Format von printf() und weitere für die jeweiligen Werte:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
sub write_log
{
    my( $id, @values ) = @_; # pick parameters

    # ...
    print  LOG '-'x60, "\n$values[0]\n" if $id == 1;
    printf LOG @values if $id != 1;
    print  LOG "\n"    if $id == 3;
    # ...
} # write_log

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
Duff
 2008-08-02 11:08
#113015 #113015
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Ok, danke.

Aber wie kann oder muss ich dann einen String, wie z.B. ("%-16s : %-120s\n", "Benutzername", "Genutze Quota's in %"), übergeben???
D'OH
Daniel
MatthiasW
 2008-08-02 16:22
#113018 #113018
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Ein paar Beispiele, wie du die angepasste Subroutine write_log() verwenden kannst:
Code: (dl )
1
2
3
4
5
write_log( $id, $value );
write_log( $id, $format, @param );

write_log( 1, 'value' );
write_log( 2, "%-16s : %-120s\n", "Benutzername", "Genutze Quota's in %" );

Hast du tatsächlich einen String vorliegen, oder doch eine Liste?
Falls du eine Liste vorliegen hast, die das Format und die Parameter für dieses Format enthält (danach siehts nämlich aus), kannst du diese Liste einfach nach der $id an die Subroutine übergeben.
Hast du aber einen String von dem angegebenen Format vorliegen, so musst du diesen String erst einmal in die einzelnen Stücke zerlegen, das könnte folgendes Codestück erledigen:
Code: (dl )
1
2
3
my $str = q{("%-16s : %-120s\n", "Benutzername", "Genutze Quota's in %")};
$str =~ s/\\n/\n/g; # ersetze \n durch newline
my @p = $str =~ /"((?:[^"]|\\")*)"/g; # hole die einzelnen Stücke

Der entstandene Array @p, kann dann einfach nach der $id an write_log() übergeben werden.

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
Duff
 2008-08-04 21:59
#113081 #113081
User since
2006-10-06
283 Artikel
BenutzerIn

user image
DAnke.

Ich hätte allerdings noch eine Frage.

1. Wie ist nochmals der reguläre Ausdruck zu verstehen? (z.B. das ?: habe die Bedeutung nicht mehr im Kopf. War das, dass es sich hier um eine normale Klammern handelt, also nicht zum Speichern der Variable?)

2. Wie würdest du dass Ganze lösen? Ich meine jetzt was du wie der Funktion übergeben würdest?

Danke.
D'OH
Daniel
MatthiasW
 2008-08-04 22:11
#113084 #113084
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Zu 1: Ja damit wird der geklammerte Teil nicht in einer Spezialvariablen gespeichert.
Zu 2: Die Frage verstehe ich nicht ganz^^ Wenn ich dies hier:
Code (perl): (dl )
printf LOG ("%-16s : %-120s\n", "Benutzername", "Genutze Quota's in %");

erreichen möchte, rufe ich die Funktion folgendermaßen auf:
Code (perl): (dl )
write_log( 2, "%-16s : %-120s\n", "Benutzername", "Genutze Quota's in %" );

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
Duff
 2008-08-05 12:32
#113100 #113100
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Was ich meine ist, ob du es so aufrufen würdest oder es über eines deiner anderen Beispiele machen würdest.
D'OH
Daniel
MatthiasW
 2008-08-05 14:14
#113106 #113106
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Das käme darauf an, wie ich die Daten(Id, [Format, Parameter]|value) vorliegen habe.
Hätte ich die Daten bereits in Variablen, würde ich diese Variablen verwenden(logisch). Ansonsten würde ich die Daten einfach so an die Subroutine übergeben.

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
Duff
 2008-08-05 15:16
#113107 #113107
User since
2006-10-06
283 Artikel
BenutzerIn

user image
MatthiasW+2008-08-05 12:14:21--
Das käme darauf an, wie ich die Daten(Id, [Format, Parameter]|value) vorliegen habe.
Hätte ich die Daten bereits in Variablen, würde ich diese Variablen verwenden(logisch). Ansonsten würde ich die Daten einfach so an die Subroutine übergeben.

MfG


Ich muss ja quasi die Daten zur Übergabe noch erstellen. Da ist nur die Frage, wie man es "am besten" realisiert.
D'OH
Daniel
<< >> 9 Einträge, 1 Seite



View all threads created 2008-08-01 18:11.