Schrift
[thread]6409[/thread]

split in foreach?

Leser: 1


<< |< 1 2 >| >> 17 Einträge, 2 Seiten
jemand
 2004-07-17 20:18
#84555 #84555
User since
2004-05-14
231 Artikel
BenutzerIn
[default_avatar]
Hi,
ich hab ne foreach mit nem split innen drin und da soll dan rausgesucht werden welche Zeile auf etwas passt
hab statt dem split auch schon nen regexp versucht aber nichts geht
wenn ich aber ohne foreach mach un nur die zeile in split gebe die gefunden werden soll gehts
hier mal der code für die einzelne subroutine:
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
sub login{
my($name, $pwd)= @_;
open(DATI, '<', 'iuser.dat');
flock(DATI, 2);
my @daten = <DATI>;
close(DATI);
my $out;
my $dat = @daten;
$i=1;
while($i<=$dat){
@ud = split(/\*\*/, $daten[$i]);
if($ud[1] eq $name){
if($pwd eq $ud[19]){ $out='User als '.$ud[1].' identifiziert!'; }else{ $out='Falsches Passwort'; }
}else{
$out='User nicht identifiziert!';
}
$i++;
}
print "Content-type: text/html\n\n";
print <<"EOF";
<html><head>
<title>Output Tester</title>
</head><body>
Hier ist die Ausgabe:<br><br>
EOF
print $out.'<br><br>';
print $_.'<br>' for @ud;
print '</body></html>';
}
print uc 'i',chr(29*4).q+'s +.++($_=q-m-),++$_;
print chr for 116,$_[0],97,$_[0],98;
print 'ug,',chr(), scalar reverse qq?!erutaef a s'ti?;
Taulmarill
 2004-07-17 20:31
#84556 #84556
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
hm, also in dem code den du gepostet hast seh ich jetz kein for/foreach. aber eine sache is mnir trotzdem aufgefallen.
wenn du die zeile gefunden hast, in der der gesuchte username steht, solltest du mit last aus der while schleife springen.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
jemand
 2004-07-18 00:00
#84557 #84557
User since
2004-05-14
231 Artikel
BenutzerIn
[default_avatar]
jaah ich hatte das mit foreach gemacht dann auf while umgestellt weil nicht ging iss aber im prinzip das selbe
aber wieso funtstz nicht?
print uc 'i',chr(29*4).q+'s +.++($_=q-m-),++$_;
print chr for 116,$_[0],97,$_[0],98;
print 'ug,',chr(), scalar reverse qq?!erutaef a s'ti?;
betterworld
 2004-07-18 00:16
#84558 #84558
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
foreach my $i (1..$dat)
esskar
 2004-07-18 00:18
#84559 #84559
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
mit foreach würde ich das ganze so schreiben

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
sub login
{
my($name, $pwd) = @_;
my $dati; # so muss ein filehandle aussehen :)
my $out = "";

if(open($dati, '<', 'iuser.dat'))
{
flock($dati, 2);
my @daten = <$dati>;
close($dati);

$out = "User nicht identifiziert oder falsches Passwort!";
foreach (@daten)
{
my @ud = split(/\*\*/, $_);
if($ud[1] eq $name and $pwd eq $ud[19])
{
$out = "User als $name identifiziert!";
last;
}
}
}
return $out;
}


mit while, so

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
sub login
{
my($name, $pwd) = @_;
my $dati; # so muss ein filehandle aussehen :)
my $out = "";

if(open($dati, '<', 'iuser.dat'))
{
flock($dati, 2);

$out = "User nicht identifiziert oder falsches Passwort!";
while(<$dati>)
{
my @ud = split(/\*\*/, $_);
if($ud[1] eq $name and $pwd eq $ud[19])
{
$out = "User als $name identifiziert!";
last;
}
}

close($dati);
}
return $out;
}
betterworld
 2004-07-18 00:33
#84560 #84560
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Ich habe mir das jetzt gerade noch einmal genauer durchgelesen (nachdem ich es mit "perltidy" richtig eingerueckt habe), und mir ist aufgefallen, dass Dein groesstes Problem wohl ist, dass ein Array mit n Elementen nicht von 1 bis n sondern von 0 bis n-1 indiziert ist. Du ignorierst also die erste Zeile. Und beim letzten Durchlauf steht $i auf $dat, jedoch existiert nach eben genanntem Argument kein Arrayelement mit Index $dat. Somit wird $out immer auf die Fehlermeldung gesetzt.

Taulmarill hat voellig recht. Wenn Du die Schleife nicht mit "last" verlaesst, sobald Du den richtigen Eintrag gefunden hast, wird $out wieder auf eine Fehlermeldung gesetzt.

Ausserdem solltest Du beachten, dass jede Zeile am Ende ein \n hat, weswegen sich ein chomp anbietet.

Hier noch mal alles in Kurzform:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
my $out = "Nicht gefunden";
foreach my $datum (@daten) {
chomp $datum;
my @ud = split /\*\*/, $datum;
if ($ud[1] eq $name) {
if ($ud[19] eq $pwd) {
$out = "Authentifiziert";
} else {
$out = "Verweigert";
}
last;
}
}

Hierbei wird $out am Anfang auf "Nicht gefunden" gesetzt. Fall tatsaechlich nichts gefunden wird, bleibt $out auf dieser Meldung stehen.

Wahrscheinlich muss es auch $ud[0] und $ud[18] statt 1 und 19 heissen, denn auch dieses Array wird von 0 an gezaehlt.\n\n

<!--EDIT|betterworld|1090097729-->
jemand
 2004-07-18 13:23
#84561 #84561
User since
2004-05-14
231 Artikel
BenutzerIn
[default_avatar]
für wie dumm haltet ihr mich?
ich weiß natürlich dass man im Array bei 0 anfängt
ich hatte es ähnlich wie esskar mit foreach gemacht und es ging nicht
hing nur am last
seit welcher perl version nimmt man $kalare für filehandles?
ich hatte in nem buch als FH und in der selfhtmldoku als FH gelernt
print uc 'i',chr(29*4).q+'s +.++($_=q-m-),++$_;
print chr for 116,$_[0],97,$_[0],98;
print 'ug,',chr(), scalar reverse qq?!erutaef a s'ti?;
renee
 2004-07-18 14:11
#84562 #84562
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich glaube, dass Dich hier keiner für dumm hält. Das mit dem Index ist nur sehr häufig ein Fehler, der auch erfahreneren Programmierern unter Umständen mal passiert...

Gut, dass es jetzt geht...

Du kannst beides als Filehandle nehmen... Ich persönlich nehme lieber das FH, weil man dann gleich auf dem ersten Blick erkennen kann, dass es ein Filehandle ist - und für STDIN und STDOUT wird die gleiche Schreibweise benutzt...
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/
betterworld
 2004-07-18 14:25
#84563 #84563
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=jemand,18.07.2004, 11:23]für wie dumm haltet ihr mich?[/quote]
Sorry, ich wollte Dich nicht kraenken oder aehnliches. Wie renee schon sagt, halte ich Dich nicht fuer dumm.

Aber bei Deinem Code ist dies definitiv einer der Gruende dafuer, dass er nicht funktioniert (es sei denn, man setzt vorher $[=1 oder so). Daher dachte ich, ich weise mal sicherheitshalber daraufhin. Wenn Du es schon wusstest, ueberlese es bitte.
esskar
 2004-07-18 17:02
#84564 #84564
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=jemand,18.07.2004, 11:23]seit welcher perl version nimmt man $kalare für filehandles?
ich hatte in nem buch als FH und in der selfhtmldoku als FH gelernt[/quote]
das kann man tun und lassen wie man will...
wenn man aber z.B. FH schreib, dann hat man z.b. probleme, wenn man mit rekursion arbeitet, da überschreibt man sich nämlich sein FH - kann bei STDIN und STDOUT natürlich nicht passieren :)
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2004-07-17 20:18.