Schrift
[thread]86[/thread]

Den richtigen Eintrag in einer Datei finden: Ich kotz gleich...



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
cbxk1xg
 2003-10-31 16:51
#8700 #8700
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich habe das Problem schon in einem anderem Thread beschrieben, komme aber nicht weiter. Ich habe eine Textdatei die folgendermaßen formatiert ist:
Code: (dl )
1
2
3
[EMAIL=email@mail.de]email@mail.de[/EMAIL]]email@mail.de|123456789
[EMAIL=bla@laber.de]bla@laber.de[/EMAIL]]bla@laber.de3216548958
[EMAIL=sag@was.de]sag@was.de[/EMAIL]]sag@was.de97655786



Und die dusselige Sub liest mir immer nur den letzten Eintrag aus dieser Datei aus. Ich will aber auch gerne die anderen Zeilen abgleichen! Ich verstehe das Problem nicht, da ich eigentlich nichts besonderes mache, was ich nicht sonst auch tun würde.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sub CheckTempDB
{
# Templist öffnen und einlesen
open (TEMP, "<$templist") or &error("Unable to open the templist file for reading");
if ($flock eq "y") {flock TEMP, 2;}
my @templist = <TEMP>;
close(TEMP);

# Templist sortieren und auf Strings rausfiltern
foreach $tempstring(@templist)
{
s/\r?\n//g; #Entfehrnt den verwi... Zeilenumbruch!
($LISTOptMail, $LISTOptID) = split (/\|/,$tempstring);

if (($LISTOptMail eq $LINKOptMail) && ($LISTOptID eq $LINKOptID)) {$OptIDStatus = 'ok';}
else {$OptIDStatus = 'error';}
}
}
\n\n

<!--EDIT|cbxk1xg|1067611942-->
Tom
 2003-10-31 17:00
#8701 #8701
User since
2003-09-20
470 Artikel
BenutzerIn
[Homepage] [default_avatar]
Probiers mal so

Code: (dl )
1
2
3
4
 foreach (@templist)
{
s/\r?\n//g; #Entfehrnt den verwi... Zeilenumbruch!
($LISTOptMail, $LISTOptID) = split (/\|/,$_);


Tom
Computerprobleme??? -> http://www.weber-computerhilfe.de

Fordere keine Anerkennung!
Zeige was und man wird Dich kennen
cbxk1xg
 2003-10-31 17:03
#8702 #8702
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Das ergibt leider das gleiche Ergebniss.
Tom
 2003-10-31 17:12
#8703 #8703
User since
2003-09-20
470 Artikel
BenutzerIn
[Homepage] [default_avatar]
Was passiert wenn du

Code: (dl )
s/\r?\n//g; #Entfehrnt den verwi... Zeilenumbruch!


mal wegläßt???

Tom
Computerprobleme??? -> http://www.weber-computerhilfe.de

Fordere keine Anerkennung!
Zeige was und man wird Dich kennen
cbxk1xg
 2003-10-31 17:22
#8704 #8704
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Dann passiert immer noch das gleiche. Aus irgendeinem Grund bekomme ich immer nur den Wert der letzten Zeile. Ich glaub ich mach das gleich mit PHP wenn's nich gleich funktioniert. Ich kann zwar (noch) kein PHP, aber das kann sich ja ändern. Geht vieleicht schneller...
[E|B]
 2003-10-31 18:21
#8705 #8705
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Quote
s/\r?\n//g; #Entfehrnt den verwi... Zeilenumbruch!


Was soll das denn? Für so etwas gibt's chomp!
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
betterworld
 2003-10-31 18:24
#8706 #8706
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Naja, wenn Du nach der Schleife auf $tempstring zugreift, ist es natuerlich der letzte Wert. Alles zusammen bekommst Du mit join "", @templist. Viel einfacher geht es aber auch so:
Code: (dl )
1
2
3
4
5
{
local $/;
my $inhalt = <FILE>;
$inhalt =~ s/\r?\n//g;
}

Danach steht in Inhalt der gesamte Inhalt der Datei, bloss ohne Zeilenumbrueche. Ist es das, was Du erreichen wolltest?
Edit: Nein, ich glaube es ist nicht, was Du wolltest. Jedenfalls solltest Du mal Deinen Code angucken, ob Du nicht $_ und $tempstring irgendwie verwechselst.\n\n

<!--EDIT|betterworld|1067617706-->
[E|B]
 2003-10-31 18:27
#8707 #8707
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
@betterworld

Das liefert die nur den ersten Eintrag!
Wenn du die ganze Datei einlesen willst, dann mit "join("",<HANDLE>)"!
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
DS
 2003-10-31 18:28
#8708 #8708
User since
2003-08-04
247 Artikel
BenutzerIn
[default_avatar]
Das Problem liegt in der foreach-Schleife und in der Art, die Variable $OptIDStatus zu setzen, denn sie wird in jedem Durchgang gesetzt, und damit ist ja wohl klar, daß sie letztendlich das enthalten wird, was im letzten Durchgang beim Vergleich herauskommt. Dadurch erweckt es den Anschein, als würde die ersten Zeilen gar nicht beachtet werden.

Es ist also ein logisches Problem, kein Problem der Programmiersprache, bei PHP würde da genau das selbe passieren.

Probier's mal so:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
print &CheckTempDB('temp.var',1,'bla@laber.de]bla@laber.de','3216548958');

sub CheckTempDB {
 my ($datei,$flock,$linkmail,$linkid) = @_;
 # Templist öffnen und einlesen
 open (DATEI,$datei) || die 'Unable to open the templist file for reading';
  flock (DATEI,2) if $flock;
  chomp (my @zeilen = <DATEI>);
 close (DATEI);
 # Templist sortieren und auf Strings rausfiltern
 foreach my $zeile (@zeilen) {
  my ($mail,$id) = split(/\|/,$zeile);
  return 'ok' if ($mail eq $linkmail) && ($id eq $linkid);
 }
 return 'error';
}


(Ich mag keine Variablen in Groß- und Kleinschreibung! ;))
betterworld
 2003-10-31 18:30
#8709 #8709
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[E|B
,31.10.2003, 17:27]Das liefert die nur den ersten Eintrag!

Nein, nur wenn $/ definiert ist.
Aber wie ich oben schon anmerkte: Nachdem ich das Programm von cbxk1xg noch einmal angeguckt habe, stellte ich fest, dass ich ihn doch falsch verstanden hatte
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2003-10-31 16:51.