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

Anfängerfrage Zeichenkettenvergleich



<< |< 1 2 >| >> 16 Einträge, 2 Seiten
Gast Gast
 2007-06-17 15:26
#77579 #77579
Ich habe hier folgender Testscript, das einzugebene Passwörter mit dem Inhalt eines Arrays abgleichen soll. Die Eingabe soll nur 3 mal möglich sein. Bei korrekter Eingabe soll "accepted" ausgegeben werden. Leider haut irgendwas beim Vergleich nicht hin. Wenn ich mit eq vergleiche, wird der if Zweig nie ausgeführt, auch wenn ein passendesPW eingetragen wird. Ein Vergleich mit == ist dagegen offenbar in jedem Fall wahr. What`s wrong???


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
#!/usr/bin/perl

@passwd = ("toor","pass2","xyz");

#Zähler für die Schleifendurchläufe:
$i = 0;

while($i < 3) {
print "Passwort eingeben: ";
$pw = <STDIN>;
chomp($pw);


foreach(@passwd)

# Test der Variableninhalte:
{print "DollarS: $_ ";
print "DollarPW: $pw \n"
}

if ($pw eq $_)
{ print "accepted! \n";
last; }

$i++;

if ($i == 3)
{print "Eingabe ist nur 3 mal möglich. \n Das Script wird nun beendet. \n";}
}
Ronnie
 2007-06-17 15:45
#77580 #77580
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Ein Label für die Schleife die mit last verlassen werden soll ist sinnvoll:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl

use strict;
use warnings;

my @passwords = qw/toor pass2 xyz/;

PASSWD: for (1..3) {
print "Passwort eingeben: ";
chomp(my $pw = <STDIN>);
foreach my $valid (@passwords) {
last PASSWD if ($pw eq $valid);
}
die "Eingabe ist nur 3 mal möglich.\n" if $_ == 3;
}

print "Passwort wurde akzeptiert.\n";
pktm
 2007-06-17 15:47
#77581 #77581
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

use strict; und use warnings; würden dich auf das Problem ausmerksam machen:
Du verwendest $_ außerhalb der foreach-Schleife, wo du es aber mit den Passwörtern belegst.
Nach der Schleife hat $_ keinen Wert mehr, entsprechend kommst du auch nciht in deine Kontrollstruktur rein.

Du musst dir merken, ob das Passwort gültig war. Ich verwende dafür gerne eine Variable die ich mir vorher ddeklariere und hinterher abprüfe. Das geht bestimmt auch noch irgendwie ander, aber ich mache es gerne so.

Und hey, findest du nicht, dass das hjier besser zu lesen ist? ;-)

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
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/perl

use strict;
use warnings;

my @passwd = ("toor","pass2","xyz");

#Zähler für die Schleifendurchläufe:
my $i = 0;

while($i < 3) {
   print "Passwort eingeben: ";
   my $pw_eing = <STDIN>;
   chomp($pw_eing);
   
   # merken, ob das Passwort gültig war
   my $gueltig = 0;
   
   # Test der Variableninhalte:
   foreach my $pwd (@passwd) {
       print "Passwort in Array: $pwd ";
       print "Passwort aus Eingabe: $pw_eing \n";
       
       if ($pw_eing eq $pwd) {
           print "accepted! \n";
           $gueltig = 1;
           last; # last für foreach-schleife
       }
       
   }
   
   last if $gueltig; # last für while-schleife
   
   # was macht das hier wohl....
   $i++;
   
   if ($i >= 3){ # >= ist besser, denn wer sagt, dass man $i immer nur um 1 erhöhen kann
       print "Eingabe ist nur 3 mal möglich. \n Das Script wird nun beendet. \n";
       exit(0); #dann machen wir das doch auch
   }
}




Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
betterworld
 2007-06-17 17:39
#77582 #77582
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
pktm: Zwei Mal last aufzurufen und ein Flag zu setzen macht die Sache eigentlich nur unnoetig kompliziert.  Wie Ronnie zeigt, kann man das auch einfach durch last mit Label bewerkstelligen.
Quote
What`s wrong???

Auf jeden Fall das Zeichen zwischen t und s, denn das ist ein Accent grave.
pktm
 2007-06-17 18:38
#77583 #77583
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
[quote=betterworld,17.06.2007, 15:39]pktm: Zwei Mal last aufzurufen und ein Flag zu setzen macht die Sache eigentlich nur unnoetig kompliziert.  Wie Ronnie zeigt, kann man das auch einfach durch last mit Label bewerkstelligen.
Quote
What`s wrong???

Auf jeden Fall das Zeichen zwischen t und s, denn das ist ein Accent grave.[/quote]
Ja, die Implementierung mit der while-Schleife ist generell ncit die glücklichste, aber so habe ich auch mal angefangen :)

Und falsch ist definitiv (neben dem `) die Variable $_ in der If-Abfrage :) (*klugscheiß*)
http://www.intergastro-service.de (mein erstes CMS :) )
Gralle
 2007-06-22 18:00
#77584 #77584
User since
2007-06-22
1 Artikel
BenutzerIn
[default_avatar]
Danke für Eure Hilfe - funktioniert 1A! Und sorry, dass ich mich erst so spät melde, es gab Probleme mit der Registrierung im Forum.:)
RPerl
 2007-06-22 19:56
#77585 #77585
User since
2006-11-26
384 Artikel
BenutzerIn

user image
Hallo,

wenn wir schon einmal bei diesem Thema sind, dann hab ich auch mal eine Frage.

Also erstmal, noch ein Bsp. fuer den Threadersteller, evtl. kann er das ja auch brauchen! ;)

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl

use strict;
use warnings;

my @array = (1,0,"foo",0,"foo");

for(my $i = 0; $i <= $#array; $i++) {
     if ($array[$i] eq 'foo') {
               
 print "\"foo\" -String gefunden bei:";
               
 print " Position " . $i . "\n";
     } 
}
    


Dazu aber auch noch eine Frage: geht das auch sauberer mit foreach bzw. generell sauberer / besser?

Gruß,

RPerl

p.s: in letzter Zeit frage ich mich das irgendwie haeufig. Gibt es evtl. manuals / docs zu sowas? Also was alles sauberer style ist und was nicht?\n\n

<!--EDIT|RPerl|1182527835-->
#Kein Kommentar
 2007-06-22 20:03
#77586 #77586
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
meinst du das vielleicht so?

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl

use strict;
use warnings;

my @array = (1,0,"foo",0,"foo");

foreach my $i (0..$#array) {
     
     print "\"foo\" -String gefunden bei: Position $i\n" if ($array[$i] eq 'foo');
             
}
\n\n

<!--EDIT|#Kein Kommentar|1182528274-->
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
RPerl
 2007-06-22 20:05
#77587 #77587
User since
2006-11-26
384 Artikel
BenutzerIn

user image
Ok ... klasse! :)
Danke!
sid burn
 2007-06-22 20:15
#77588 #77588
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Quote
p.s: in letzter Zeit frage ich mich das irgendwie haeufig. Gibt es evtl. manuals / docs zu sowas? Also was alles sauberer style ist und was nicht?

Jup.
http://www.oreilly.de/catalog/perlbpger/

-----------------

Und noch zwei Lösungen. :)

1)
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl
use strict;
use warnings;

my @passwords = qw/ foo bar /;

my $count = 0;
{
print "Passwort eingeben: ";
chomp( my $input = <STDIN> );

last if grep { $input eq $_ } @passwords;
die "3 mal Falsch eingegeben.\n" if ++$count == 3;
redo;
}

print "Access Granted\n";


2)
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl
use strict;
use warnings;

my @passwords = qw/ foo bar /;

my $count = 0;
my $is_valid = 0;
while ( $count++ < 3 and not $is_valid ) {
print "Passwort eingeben: ";
chomp( my $input = <STDIN> );

$is_valid = grep { $input eq $_ } @passwords;
}

die "Access Denied\n" if not $is_valid;
print "Access Granted\n";
\n\n

<!--EDIT|sid burn|1182529671-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2007-06-17 15:26.