Schrift
[thread]7029[/thread]

Foreach Schleifen funktionieren nicht mehr



<< >> 7 Einträge, 1 Seite
Grand
 2005-06-02 02:38
#55277 #55277
User since
2005-06-02
2 Artikel
BenutzerIn
[default_avatar]
Hallo!
Vielleicht kann mir hier ja jemand weiterhelfen. Ich nutze in verschiedenen Scripts seit Jahren die folgende (oder ähnliche) Routine.
Jetzt auf einmal (nach Umzug auf neuen Server) und nun auch auf meinem neuen PC (also überall wohl die neusten Perl Versionen)
funktioniert es einfach nicht mehr.
Es wird nicht mehr die gesamte Datei, also alle Zeilen der jeweiligen Daten-Datei, sondern nur noch die erste Zeile eingelesen. Bisher, wie gesagt jahrelang funktionierte es. Es wurde auch nichts an den Scripten geändert.

######## schnipp #################
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
open(DATA,"$tempfile");
if ($sperre eq 1) {flock(DATA, 1);}
@lines = <DATA>;
close(DATA);

open(DATA,">$tempfile");
if ($sperre eq 1) {flock(DATA, 2);}
foreach $line (@lines)
{
($host,$reserve1,$reserve2,$number,$entrytime,$titel,$url,$count) = split(/\|/,$line);
if ($psw eq 1)
{
$count++;
$count--;
print DATA ("$count|$titel|$url|$host|$reserve1|$reserve2|$number|$entrytime\n");
}

else
{
print DATA $line;
}
}
close(DATA);

######## schnapp #################

In großen Hoffnung ;-)
Mario

edit renee: ne Runde [code]-Tags spendiert\n\n

<!--EDIT|renee|1117690178-->
esskar
 2005-06-02 03:23
#55278 #55278
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
also, ich rate dir erstmal

Code: (dl )
1
2
use strict;
use warnings;


zu benutzen.

Kann es sein, dass sich auch das Betriebsystem geändert hat, und die Zeilenumbrüche nicht mehr passen?
renee
 2005-06-02 09:32
#55279 #55279
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich würde auch zu einer Fehlerbehandlung raten:
Code: (dl )
1
2
3
4
5
6
open(DATA,"<$tempfile") or die $!;
[...]

open(DATA,">$tempfile") or die $!;
[...]
close DATA or die $!;
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
J-jayz-Z
 2005-06-02 11:24
#55280 #55280
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich hatte auch mal so ein Problem. Versuch mal das hier, danach gings bei mir:
Code: (dl )
1
2
3
4
while(<DATA>)
{
push @lines, $_;
}

Bist du sicher, das nur eine Zeile eingelesen wird oder erhälst du nur als output in $tempfile eine Zeile?
Mach halt mal einfach so zum test ein
Code: (dl )
1
2
3
4
foreach (@lines)
{
print $_;
}

dann siehst du, ob es wirklich am einlesen liegt...
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
Grand
 2005-06-02 19:20
#55281 #55281
User since
2005-06-02
2 Artikel
BenutzerIn
[default_avatar]
Hallo!
Es liegt nicht am Script, es lag an der Übertragung beim Serverwechsel und zuletzt auch an Codierungs-Veränderungen bei mir auf dem PC im UltraEditor.
Die Log Datei, die ich anschließend vom Server geholt habe, war falsch codiert und dadurch wurde der zeilenwechsel nicht erkannt.
Soll man bloß erst einmal drauf kommen, wenn sonst "alles normal" aussieht und vorher vor allen Dingen funktionierte.
Vielen dank für die Tipps.

Mario

P.S. Ich muß trotzdem mal die alten Scripte überarbeiten, nach use strict bekam ich bald einen Herzanfall und natürlich einen Error im Browser ;-)
Dubu
 2005-06-03 10:17
#55282 #55282
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=J-jayz-Z,02.06.2005, 09:24]Ich hatte auch mal so ein Problem. Versuch mal das hier, danach gings bei mir:
Code: (dl )
1
2
3
4
while(<DATA>)
{
push @lines, $_;
}
[/quote]
Cargo Cult Coding?
Algorithmische Wunderheilung?

Ein @lines = <DATA> liest alle Zeilen in @lines ein, ein while (<DATA>) { push @lines, $_; } liest eine Zeile nach der anderen ein und fuegt sie an @lines an, was auf dasselbe hinaus laeuft. Ich kann mir wirklich keine Randbedingungen vorstellen, unter denen bei diesen Codezeilen unterschiedliches heraus kommt, falls @lines vorher leer war. Es wird der gleiche Diamond-Operator benutzt, nur einmal im skalaren und einmal im Array-Kontext. Die Vorstellung, was eine Zeile ist, kann sich damit auch nicht unterscheiden.
J-jayz-Z
 2005-06-03 10:43
#55283 #55283
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
@Dubu: Keine Ahnung, vielleicht lag der Fehler auch woanderst und dadurch wurd es behoben oder so. Danach gings jedenfalls....
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
<< >> 7 Einträge, 1 Seite



View all threads created 2005-06-02 02:38.