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

Brauche Hilfe



<< |< 1 2 >| >> 11 Einträge, 2 Seiten
Gast Gast
 2005-06-06 23:26
#55358 #55358
Also, ich lerne gerade Perl, mit dem Buch In 21 Tagen Perl, und wollte mal ein kleines Programm, Textbasiert schreiben, das Benutzer speichert, und eine 'Benutzeroberfläche enthält'.

Ist sicher sehr einfach, allerdings, hänge ich jetzt schon 2 Tage dran, und ich find einfach den Fehler nicht, denn bei der Benutzeroberfläche hagt es.

Das Programm soll nichts großartiges sein, nur wollte ich mir diese kleine Rutine bauen, und ich hab zwar noch nicht sehr viel gelernt, aber dafür, sollte es reichen.
Quellcode :

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
print "\n\n\n";
$s = "###";

print "\t\t\tBENUTZER ANMELDEN/ERSTELLEN\n\n\n";

print "Wollen sie sich anmelden oder wollen sie einen neuen Benutzer ertsellen?\n";
print "Zum anmelden login, um einen neuen Benutzer zu erstellen new eingaben.\n";
print "Um die Daten eines Benutzers zu veraender geben sie aendern in ihrer Benutzeroberflaeche ein.\n\n";
print "Um das Programm zu Beenden geben sie q oder quit ein.\n\n";
print "Eingabe: ";
$eingabe = <STDIN>;chomp $eingabe;

open FH, "user.txt";
foreach $str (<FH>) {
push @user,$str;
}
chomp @user;
close FH;
while (){
if ($eingabe eq "new") {
print "\n\n\nGeben sie ihren Vornamen an: ";
$vname = <STDIN>;chomp $vname;
print "\nGeben sie ihren Nachnamen an: ";
$nname = <STDIN>;chomp $nname;
print "\nGeben sie ihren Wohnort an (Dortmund,Koeln...): ";
$ort = <STDIN>;chomp $ort;
print "\nGeben sie ihre Postleitzahl an: ";
$plz = <STDIN>;chomp $plz;
print "\nGeben sie den Strassennamen an: ";
$str = <STDIN>;chomp $str;
print "\nGeben sie ihre Hausnummer an: ";
$hnr = <STDIN>;chomp $hnr;
print "\nGeben sie ein Passwort ein (5 Buchstaben,klein): ";
$passwort = <STDIN>;chomp $passwort;
open IL, ">>user.txt";
print IL $vname,$s,$nname,$s,$ort,$s,$plz,$s,$str,$s,$hnr,$s,$passwort,"\n";
close IL;
}
elsif (lc($eingabe) eq "quit" || lc($eingabe) eq "q") {
exit;
}
elsif (lc($eingabe) eq "login") {
foreach (@user) {
$zeile .= $_;
}
@user1 = split "###",$zeile;
print "\n\nGeben sie bitte ihren Benutzernamen ein: ";
$benutzer = <STDIN>;chomp $benutzer;
print "\n\nUnd jetzt bitte das Passwort: ";
$benutzer_pass = <STDIN>;chomp $benutzer_pass;
for ($c = 0;$c <= index($user1[$c],$benutzer);$c++) {
}
if ($user1[$c] eq $benutzer) {
$d = $c + 6;
}
elsif ($user1[$d] eq $benutzer_pass) {
print "\n\n\nSie haben ihre Benutzeroberflaeche betreten.\n\n\n";
print "\t\t\tWillkommen $benutzer";
print "\n\nUm ihre Persoehnlichen Daten einsehen zu koennen, geben sie look ein.";
print "\nUm sie zu aendern, einfach aendern eingeben.";
print "\nUm sich abzumelden geben sie abmelden oder ab ein.";
INNEN:while () {
print "\n\nEingabe: ";
$eingabe1 = <STDIN>;chomp $eingabe1;
if (lc($eingabe1) eq "look") {
$p1 = index($user1[$c],$benutzer);
$p2 = index($user1[$d],$benutzer_pass);
$look = substr(@user1,$p1,$p2 - $p1);
print "\n\n\nPersoehnliche Daten: $look";
}
elsif (lc($eingabe1) eq "abmelden" || lc($eingabe1) eq "ab") {
print "\n\n\nSie haben ihre Benutzeroberflaeche verlassen.";
last INNEN;
}
elsif (lc($eingabe1) eq "aendern") {
print "\n\n\nDieser Befehl existiert noch nicht.";
}
}
}
else {
print "\n\n\nDas war keine korrekte Eingabe!";
}
print "\n\nEingabe: ";
$eingabe = <STDIN>;chomp $eingabe;
}


Kann mir einer sagen, wo das Problem liegt ?

Ich finds nicht.

Bitte um Hilfe
BungeeBug
 2005-06-07 00:03
#55359 #55359
User since
2004-03-16
54 Artikel
BenutzerIn
[default_avatar]
Nö, aber Perl wirds die sagen wenn du 1)
Code (perl): (dl )
#!/usr/bin/perl -w
in der ersten Zeile einfuegst und dann 2) darunter
Code (perl): (dl )
 use warnings;
einfuegst ... aber ich bin mir fast sicher, dass das in dem Buch auch beschrieben wurde :)\n\n

<!--EDIT|BungeeBug|1118088263-->
MfG
BungeeBug
sri
 2005-06-07 00:07
#55360 #55360
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
Umm, "-w" ist das globale "use warnings" flag...
frodus
 2005-06-07 00:12
#55361 #55361
User since
2003-09-26
147 Artikel
BenutzerIn
[default_avatar]
Hi,

vielleicht hilft Dir dass ja weiter:
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#!/usr/bin/perl 

# ------------------------------------------------------------
# Warnungen einschalten sollte in keinem Programm fehlen!!
# ------------------------------------------------------------
use strict; # perldoc strict
use warnings; # perldoc warnings

print "\n\n\n";
my $s = "###"; # perldoc -f my

print "\t\t\tBENUTZER ANMELDEN/ERSTELLEN\n\n\n";

print "Wollen sie sich anmelden oder wollen sie einen neuen Benutzer ertsellen?\n";
print "Zum anmelden login, um einen neuen Benutzer zu erstellen new eingaben.\n";
print "Um die Daten eines Benutzers zu veraender geben sie aendern in ihrer Benutzeroberflaeche ein.\n\n";
print "Um das Programm zu Beenden geben sie q oder quit ein.\n\n";
print "Eingabe: ";
my $eingabe = <STDIN>;chomp $eingabe;

open FH, "user.txt";
my @user;
foreach my $str (<FH>) {
 push @user,$str;
}
chomp @user;
close FH;
while (1) { # hier musst du eine Bedingung eintragen
 my $vname;
 my $nname;
 my $ort;
 my $plz;
 my $str;
 my $hnr;
 my $passwort;
 
 if ($eingabe eq "new") {
   print "\n\n\nGeben sie ihren Vornamen an: ";
   $vname = <STDIN>;chomp $vname;
   print "\nGeben sie ihren Nachnamen an: ";
   $nname = <STDIN>;chomp $nname;
   print "\nGeben sie ihren Wohnort an (Dortmund,Koeln...): ";
   $ort = <STDIN>;chomp $ort;
   print "\nGeben sie ihre Postleitzahl an: ";
   $plz = <STDIN>;chomp $plz;
   print "\nGeben sie den Strassennamen an: ";
   $str = <STDIN>;chomp $str;
   print "\nGeben sie ihre Hausnummer an: ";
   $hnr = <STDIN>;chomp $hnr;
   print "\nGeben sie ein Passwort ein (5 Buchstaben,klein): ";
   $passwort = <STDIN>;chomp $passwort;
   open IL, ">>user.txt";
   print IL $vname,$s,$nname,$s,$ort,$s,$plz,$s,$str,$s,$hnr,$s,$passwort,"\n";
   close IL;
 }
 elsif (lc($eingabe) eq "quit" || lc($eingabe) eq "q") {
   exit;
 }
 elsif (lc($eingabe) eq "login") {
   my $zeile;
   foreach (@user) {
     $zeile .= $_;
   }
   my @user1 = split "###",$zeile;
   print "\n\nGeben sie bitte ihren Benutzernamen ein: ";
   my $benutzer = <STDIN>;chomp $benutzer;
   print "\n\nUnd jetzt bitte das Passwort: ";
   my $benutzer_pass = <STDIN>;chomp $benutzer_pass;
   my $c;
   for ($c = 0;$c <= index($user1[$c],$benutzer);$c++) {
   }
   my $d;
   if ($user1[$c] eq $benutzer) {
     $d = $c + 6;
   } elsif ($user1[$d] eq $benutzer_pass) {
     print "\n\n\nSie haben ihre Benutzeroberflaeche betreten.\n\n\n";
     print "\t\t\tWillkommen $benutzer";
     print "\n\nUm ihre Persoehnlichen Daten einsehen zu koennen, geben sie look ein.";
     print "\nUm sie zu aendern, einfach aendern eingeben.";
     print "\nUm sich abzumelden geben sie abmelden oder ab ein.";
     INNEN : while (1) {
print "\n\nEingabe: ";
my $eingabe1 = <STDIN>;chomp $eingabe1;
if (lc($eingabe1) eq "look") {
 my $p1 = index($user1[$c],$benutzer);
 my $p2 = index($user1[$d],$benutzer_pass);
 my $look = substr(@user1,$p1,$p2 - $p1);
 print "\n\n\nPersoehnliche Daten: $look";
} elsif (lc($eingabe1) eq "abmelden" || lc($eingabe1) eq "ab") {
 print "\n\n\nSie haben ihre Benutzeroberflaeche verlassen.";
 last INNEN;
} elsif (lc($eingabe1) eq "aendern") {
 print "\n\n\nDieser Befehl existiert noch nicht.";
}
     }
   } else {
     print "\n\n\nDas war keine korrekte Eingabe!";
   }
   print "\n\nEingabe: ";
   $eingabe = <STDIN>;chomp $eingabe;
 }
}
 


/Frodus

P.S.: Noch viel Spass mit perl
renee
 2005-06-07 00:41
#55362 #55362
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
und auf die Fehlerbehandlung sollte man auch nicht verzichten:

Code: (dl )
open FH, "user.txt" 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/
Crian
 2005-06-08 16:43
#55363 #55363
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Solche print-Cascaden sind unschön. Dazu reicht eigentlich ein print aus.

Also statt

Code: (dl )
1
2
3
4
5
     print "\n\n\nSie haben ihre Benutzeroberflaeche betreten.\n\n\n";
print "\t\t\tWillkommen $benutzer";
print "\n\nUm ihre Persoehnlichen Daten einsehen zu koennen, geben sie look ein.";
print "\nUm sie zu aendern, einfach aendern eingeben.";
print "\nUm sich abzumelden geben sie abmelden oder ab ein.";


könntest Du schreiben:

Code: (dl )
1
2
3
4
5
     print "\n\n\nSie haben ihre Benutzeroberflaeche betreten.\n\n\n",
"\t\t\tWillkommen $benutzer",
"\n\nUm ihre Persoehnlichen Daten einsehen zu koennen, geben sie look ein.",
"\nUm sie zu aendern, einfach aendern eingeben.",
"\nUm sich abzumelden geben sie abmelden oder ab ein.";


oder

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
     print qq(


Sie haben ihre Benutzeroberflaeche betreten.



Willkommen $benutzer

Um ihre Persoehnlichen Daten einsehen zu koennen, geben sie look ein.
Um sie zu aendern, einfach aendern eingeben.
Um sich abzumelden geben sie abmelden oder ab ein.);


oder

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
     print <<"ENDE";



Sie haben ihre Benutzeroberflaeche betreten.



Willkommen $benutzer

Um ihre Persoehnlichen Daten einsehen zu koennen, geben sie look ein.
Um sie zu aendern, einfach aendern eingeben.
Um sich abzumelden geben sie abmelden oder ab ein.
ENDE
\n\n

<!--EDIT|Crian|1118234693-->
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
renee
 2005-06-08 16:49
#55364 #55364
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wobei ich die die Möglichkeit mit qq~~ schöner finde als die Heredocs, da das weniger Fehleranfällig ist (Man muss nicht darauf achten, dass das Ende des Heredocs alleine in einer Zeile steht)...
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/
pq
 2005-06-08 18:56
#55365 #55365
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=renee,08.06.2005, 14:49]Wobei ich die die Möglichkeit mit qq~~ schöner finde als die Heredocs, da das  weniger Fehleranfällig ist (Man muss nicht darauf achten, dass das Ende des Heredocs alleine in einer Zeile steht)...[/quote]
man muss aber drauf achten, das kein ~ vorkommt =)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Taulmarill
 2005-06-08 19:00
#55366 #55366
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
ist halt geschmackssache. ich z.b. verwende für mehrzeilige textbausteine fast immer Template Toolkit, sofern das auf dem server verfügbar ist. ansonsten würde ich mich von fall zu fall für heredocs oder q// qq// etc. entscheiden, je nach dem was gerade besser passt.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Crian
 2005-06-13 13:39
#55367 #55367
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Gut ist auch ein Editor mit Syntaxhighlighting. Da sieht man dann schnell, ob man einen Fehler dabei gemacht hat oder nicht.
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 >| >> 11 Einträge, 2 Seiten



View all threads created 2005-06-06 23:26.