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

Wie "leere" ich @Daten?



<< |< 1 2 3 >| >> 25 Einträge, 3 Seiten
oruebe
 2004-12-09 16:56
#3666 #3666
User since
2004-07-09
46 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich habe in einer Schleife mehrmals @Stunden verwendet, um für jede Stunde einen Variable zu haben ( $Stunden[0],...,...$Stunden[24] )

Jetzt möchte ich etwas für mehrere Tage durchlaufen lassen, wobei der Wert jeder Stunde am neuen Tag leer sein soll.

Ich habe versucht "am ende des Tages" @Stunden="";
Das findet mein Server aber doof. Manchmal macht er komischerweise was und manchmal nicht.

Nehmen ich die Zeile @Stunden=""; raus, funktioniert das Script immer. Nur leider fängt er dann bei einem neuen Tag nicht bei Null an sondern zählt immer oben drauf.

Daher: WIe bekomme ich ALLE Werte von @Stunden leer?

Ich gebe zu, die Frage ich blöde formuliert aber vielleicht versteht ja jemand was ich will oder versteht mich nicht und kann mir meine Frage trotzdem beantworten :-)

Danke !!\n\n

<!--EDIT|oruebe|1102604538-->
Relais
 2004-12-09 17:03
#3667 #3667
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
undef @Stunden; # dürfte das Gesuchte sein. Es löscht die Daten und den Index von @Stunden (aber nicht das Array selber).

@Stunden = ( ); # löscht nur die Daten, gibt aber nicht den Speicher für den Index von @Stunden frei (wozu auch immer das gut sein soll).
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
Relais
 2004-12-09 17:08
#3668 #3668
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=oruebe,09.12.2004, 15:56]Ich habe versucht "am ende des Tages" @Stunden="";
Das findet mein Server aber doof. Manchmal macht er komischerweise was und manchmal nicht.[/quote]
Nochmal zu dem geschilderten Problem:

"was machen" und "manchmal was nicht machen" sind ernsthaft gesagt sehr dumme Formulierungen, die dem Fragesteller nicht gerade zur Ehre gereichen.

Da kann man den netten Leuten bei Perl-Community.de schon mehr zutrauen, und konkreteres zu schreiben. Sollte man sogar...

@Stunden = ""; entspricht @Stunden = ( "", ); -- also wird das Array @Stunden überschrieben und nur mit einem einzelnen Wert "" (leerer String) belegt. $Stunden[0] ist also ein Leerstring, mehr Inhalte das Array nicht.
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
oruebe
 2004-12-09 17:18
#3669 #3669
User since
2004-07-09
46 Artikel
BenutzerIn
[default_avatar]
ich weiß, dass das nicht gerade eine Hilfreiche Formulierung ist. Was ich aber eigentlich damit sagen wollte ist: Es gibt im Moment für mich keine erkennbare Regelmässigkeit, die ich hier schildern könnte. Ich rufe das Script 100 mal auf und davon funktionert es 5 mal, 20x bricht es nach dem 3. Tag in der 16. Std ab, mal am 2.Tag in der 8.Std.,...,...,... ohne, dass ich etwas am Script geändert habe.

Ich weiß nur: Lass ich die Zeile @Stunden ="" weg, geht es jedesmal.
Bei Deinen Vorschlägen ist es übrigens genau das Gleiche.. :-(
Relais
 2004-12-09 17:23
#3670 #3670
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=oruebe,09.12.2004, 16:18]Ich weiß nur: Lass ich die Zeile @Stunden ="" weg, geht es jedesmal.
Bei Deinen Vorschlägen ist es übrigens genau das Gleiche.. :-([/quote]
Das bedeutet: der Fehler ist an einer anderen Stelle zu suchen.

Und das obwohl es ohne diese Zeile ja "geht", was auch immer "geht" ist. Du müßtest wohl konkreter werden, Code posten.
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
oruebe
 2004-12-09 17:42
#3671 #3671
User since
2004-07-09
46 Artikel
BenutzerIn
[default_avatar]
"geht" bedeutet, dass das Script läuft. Da aber diese Zeile fehlt, sind die ausgegebenen Werte falsch, da der Dienstag also auch die Werte vom Montag noch enthält.

Aber jetzt mal ganz konkret: Es geht um eine Statistik, die besagt, an welchen Tagen und in welchen Stunden eine Datei wie häufig aufgerufen wurde. Für jeden Aufruf habe ich time (also die Sekunden) in einer Zeile einer Textdatei stehen. Hier der Code:


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
foreach $DATEIEN(<../meinOrdner/*.dat>) {
$itemnummer=$DATEIEN;
$itemnummer =~ s/..\/meinOrdner\///;
$itemnummer=~ s/.dat//;
print "$itemnummer";

open(ITEM,"../meinOrdner/$itemnummer.dat");
@ITEMZEILEN = <ITEM>;
close(ITEM);
@STD="";
@TAG="";
foreach $ITEM (@ITEMZEILEN) {
@DATEN = split(/==/, $ITEM);

($sec,$min,$hour,$mday,$mon,$year,$wday,$ydat,$isdst)=localtime($DATEN[0]); $jahr=$year; $tag=$mday; $jahr=$year; $monat=$mon+1; $jahr=$year +1900;
$aufgerufen++;
$STD[$hour]++;
$TAG[$wday]++;
}
$a=0;
while ($a<24) {print "$a: $STD[$a]\n";$a++}
print "Mo: $TAG[0]<BR>";
print "DI: $TAG[1]<BR>";
print "Mi: $TAG[2]<BR>";
print "Do: $TAG[3]<BR>";
print "Fr: $TAG[4]<BR>";
print "Sa: $TAG[5]<BR>";
print "So: $TAG[6]<BR>";


Bearbeitet von Crian: schließenden CODE-Tag spendiert\n\n

<!--EDIT|Crian|1102607735-->
Crian
 2004-12-09 17:57
#3672 #3672
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Du kannst natürlich auch mit

Code: (dl )
$stunden[$_] = 0 for 0..24;


Dein Array einfach auf definierte Werte setzen, aber das wird das Problem wohl nicht lösen, da der Fehler ja woanders zu stecken scheint. Ich werd jetzt mal einen Blick auf Deinen Code werfen...

Zum Code:

1) Verwende use strict und use warnings!
2) Frage den Erfolg Deiner Aktionen ab (open (...) or die $!;)
3) Der Punkt hat in einem regulären Ausdruck eine besondere Bedeutung und muss deshalb mit einem Backslash escaped werden.
4) Verwende nicht $a und $b (außer in Funktionen, die Du in Sort verwendest).
5) Rücke Dein Programm vernünftig ein -> perldoc perlstyle.
6) Wenn Du Werte einer Funktion abholst, von denen Du nicht alle brauchst, kannst Du bei den anderen undef hinschreiben oder aber nur einen entsprechenden Arrayslice aus dem zurückgegbenen Array ausschneiden:

Also statt

Code: (dl )
($sec,$min,$hour,$mday,$mon,$year,$wday,$ydat,$isdst)=localtime($DATEN[0]);


Code: (dl )
(undef,undef,$hour,$mday,$mon,$year,$wday,undef,undef)=localtime($DATEN[0]);


oder

Code: (dl )
($hour,$mday,$mon,$year,$wday)=(localtime($DATEN[0]))[2..6];



Und ... das soll kein "Gemecker" sein =)\n\n

<!--EDIT|Crian|1102609083-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
oruebe
 2004-12-09 18:07
#3673 #3673
User since
2004-07-09
46 Artikel
BenutzerIn
[default_avatar]
Hallo Crian,

mit Deinem Code gehts :-)

Ich hatte es auch schon mit
$a=0;while ($a<24) {$STD[$a]=0;$a++}
probiert. Das hatte aber nicht geholfen...

Hat den Dein Code irgendwelche Nachteile?\n\n

<!--EDIT|oruebe|1102608461-->
oruebe
 2004-12-09 18:12
#3674 #3674
User since
2004-07-09
46 Artikel
BenutzerIn
[default_avatar]
zu 3: Du meinst bei ".dat"?
zu 5: Bei dem Zerlegen des Datums?

Und nun mal ne ganz blöde Frage: Was ist eigentlich Perldoc...?

Klar habe ich das schon immer gehört aber wie komme ich ran? Buchhandlung, Runterladen oder eine Tastenkombination?

Ich weiß es wirklich nicht!!!
Crian
 2004-12-09 18:17
#3675 #3675
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=oruebe,09.12.2004, 17:12]zu 3: Du meinst bei ".dat"?[/quote]
ja, also statt
Code: (dl )
1
2
$itemnummer =~ s/..\/meinOrdner\///;
$itemnummer=~ s/.dat//;

Code: (dl )
1
2
$itemnummer =~ s~^\.\./meinOrdner/~~;
$itemnummer=~ s~\.dat$~~;


(Tilde statt Slash, dann siehst nicht so wild aus...)

^ und $ für exakteres Ersetzen...

Dein Code funktioniert, da der Punkt auf jedes beliebige Zeichen matcht, also auch auf den wörtlichen Punkt. Aber genauer ist es, ihn zu escapen. Wenn Du eine Datei Namens "zeitdatum.dat" hast, könnte in Deiner itenummer "zeium.dat" landen, weil das erste dat nach beliebigem Zeichen gelöscht wird (inklusive des Zeichens).

[quote=oruebe,09.12.2004, 17:12]zu 5: Bei dem Zerlegen des Datums?[/quote]

genau

[quote=oruebe,09.12.2004, 17:12]Und nun mal ne ganz blöde Frage: Was ist eigentlich Perldoc...?

Klar habe ich das schon immer gehört aber wie komme ich ran? Buchhandlung, Runterladen oder eine Tastenkombination?[/quote]

Ups... perldoc kannst Du einfach auf der Commandozeile eingeben

Code: (dl )
/home/user $ perldoc perl


Außerdem gibts noch www.perldoc.com.\n\n

<!--EDIT|Crian|1102609804-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 3 >| >> 25 Einträge, 3 Seiten



View all threads created 2004-12-09 16:56.