Schrift
[thread]12258[/thread]

Problem mit Programm



<< |< 1 2 >| >> 11 Einträge, 2 Seiten
Gast Gast
 2008-07-26 15:26
#112778 #112778
Hallo ich brauche ein Programm das mir einen String überprüft, und zwar soll er zwischen 8-16 zeichen haben, nur A-Z, a-z, 0-9 und !"#$%. enthalten und muss mindestens 1 Buchstabe und 1 Zahl enthalten. Ich bin meinen Code mehrfach durchgegangen aber ich bekomm einfach keine ausgabe obwohl das eig passen müsste...??

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
my $string1 = abc123ABC;

if( length($string1) > 7 && length($string1) < 17) {
@string1 = split(//, $string1);
$counter_zahl = 0;
$counter_abc = 0;
for( my $i= 0; $i <= length($string1); $i++) {
if( @string1[$i] =~ [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789] || @string1[$i] =~ /!/ || @string1[$i] =~ /\"/ ||
@string1[$i] =~ /#/ || @string1[$i] =~ /\$/ || @string1[$i] =~ /%/ || @string1[$i] =~ /./) {
if( @string1[$i] =~ [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ] ) {
$counter_abc++;
}
if( @string1[$i] =~ [0-9] ) {
$counter_zahl++;
}
}
}
if( $counter_zahl > 0 && $counter_abc > 0 ) {
print "$string1";
}
}
Linuxer
 2008-07-26 15:46
#112780 #112780
User since
2006-01-27
3881 Artikel
HausmeisterIn

user image
Hi,

perl kennt auch schon Zeichenbereiche, mit [a-z] sind alle Kleinbuchstaben von a bis z gemeint.
Das macht den Code viel übersichtlicher: [a-zA-Z0-9]
Die Zahlen 0-9 kann man auch als \d schreiben, also: [a-zA-Z\d]

Dann brauchst Du die Sonderzeichen nicht extra behandeln, die kannst Du in die Zeichenklasse mit reinpacken: [a-zA-Z\d!"%.]

Übrigens steht der Punkt '.' in einem Regex für jedes beliebige Zeichen; du musst ihn also entweder maskieren '\.' oder in eine Zeichenklasse packen; dort steht er nur für sich selbst.

Dann brauchst Du den String nicht aufsplitten, um jedes Zeichen einzeln zu prüfen, Perl kann mit Regex den ganzen String kontrollieren.

Mein Vorschlag (die Prüfung wurde in eine eigene Routine verlagert):

Code (perl): (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
sub _is_valid_string {
        my $string = shift;

        my $valid = 'a-zA-Z0-9!"$%.';

        # laenge kontrollieren
        return 0 if length $string < 7;
        return 0 if length $string > 16;

        # auf ungueltige Zeichen kontrollieren
        return 0 if $string =~ m/[^$valid]/;

        # auf mindestens einen Buchstaben kontrollieren
        return 0 if $string !~ m/[a-zA-Z]/;

        # auf mindestens eine Zahl kontrollieren
        return 0 if $string !~ m/\d/;

        # bisher kein Fehler? dann sollte $string ok sein
        return 1;
}


# Woerter ueberpruefen
for my $word ( qw( abc123ABC %%%%%aa ) ) {
        
        if ( _is_valid_string( $word ) ) {
            print "$word is OK\n";
        }
        else {
            print "$word is not OK\n";
        }
}


Dringend empfohlen ist die Lektüre der Perldoc; speziell:

perlrequick
perlretut
perlre
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
LanX-
 2008-07-26 15:48
#112781 #112781
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Gast+2008-07-26 13:26:39--
@string1[$i] =~ [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]


ohne in der Doku nachzuschlagen, denke ich hier fehlt mindestens ein m wenn nicht sogar eher ein m// ...

EDIT: @string1[$i] ??? Ein Arrayslice? doch lieber $string1[$i]
Linuxer
 2008-07-26 15:50
#112782 #112782
User since
2006-01-27
3881 Artikel
HausmeisterIn

user image
LanX-+2008-07-26 13:48:55--
Gast+2008-07-26 13:26:39--
@string1[$i] =~ [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]


ohne in der Doku nachzuschlagen, denke ich hier fehlt mindestens ein m wenn nicht sogar ein m// ...


*lol*, ich war so von der Zeichenklasse selbst erschlagen, dass mir das noch nicht mal aufgefallen ist ... ;(
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
LanX-
 2008-07-26 15:58
#112785 #112785
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
hmm ich glaube, ich werde dazu übergehen keinen Gäste-Code mehr zu kommentieren der ohne use strict gepostet wird.

verstehe auch nicht wieso der code so ohne Compilerfehler durchlief ...

auf =~ sollte m, s oder // folgen... ok vielleicht noch eine qr-Variable ...
pq
 2008-07-26 16:32
#112790 #112790
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
auf =~ kann auch einfach eine irgendeine variable folgen, und [...] erzeugt ein anonymes array, was
dann gleich stringifiziert wird.
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
GwenDragon
 2008-07-26 16:43
#112794 #112794
User since
2005-01-17
14607 Artikel
Admin1
[Homepage]
user image
Wer als AnfängerIn nicht am Anfang des Codes folgendes einfügt:
use strict;
use warnings;
use diagnotics; # erweiterte Ausgabe von Warnungen

erzeugt meist lauffähigen, aber oft schlampigen Code.
Dabei sagt doch Perl gern, was nicht stimmt.

@Gast
bau das in deinen Originalcode ein und Perl sagt dir, was du falsch machst.
Gast Gast
 2008-07-26 16:45
#112795 #112795
danke euch erstmal, leider klappt es nicht wenn ich es mit Filehandling verwende...

ich habe diese input.txt:
Code: (dl )
1
2
3
test:abc123abC
MY_TEST:123456ABsf
test:12345


und bekomme diese Ausgabe:
Code: (dl )
1
2
3
4
5
abc123abC
is not OK
123456ABsf
is not OK
12345 is not OK

und in output.txt steht nichts...

mein Code:
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
my $eingabe = open(FILE,"input.txt");
if(not defined($eingabe)) {
die "Fehler beim ¨ Offnen der Datei: $!\n";
}
my $ausgabe = open(FILE_OUT,">> output.txt");
if(not defined($ausgabe)) {
die "Fehler beim ¨ Schreiben der Datei: $!\n";
}

while(defined(my $line = <FILE>)) {
@start = split(/:/, $line);
$word = @start[1];

if ( _is_valid_string( $word ) ) {
print FILE_OUT "$word is OK\n";
}
else {
print "$word is not OK\n";
}


}

print "\n\n";
close(FILE);
close(FILE_OUT);
system("pause");



sub _is_valid_string {
my $string = shift;
my $valid = 'a-zA-Z0-9!"$%.';
return 0 if length $string < 7;
return 0 if length $string > 16;
return 0 if $string =~ m/[^$valid]/;
return 0 if $string !~ m/[a-zA-Z]/;
return 0 if $string !~ m/\d/;
return 1;
}
Linuxer
 2008-07-26 16:51
#112797 #112797
User since
2006-01-27
3881 Artikel
HausmeisterIn

user image
Du liest zeilenweise aus einer Textdatei. Der Zeilenumbruch wird dabei nicht automatisch entfernt. Nun gilt der Zeilenumbruch nicht als gültiges Zeichen....

perldoc -f chomp

[edit]Rechtschreibung korrigiert[/edit]
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
LanX-
 2008-07-26 16:52
#112798 #112798
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
GwenDragon+2008-07-26 14:43:09--
Wer als AnfängerIn nicht am Anfang des Codes folgendes einfügt:
use strict;
use warnings;
use diagnotics; # erweiterte Ausgabe von Warnungen

erzeugt meist lauffähigen, aber oft schlampigen Code.


@Gast: beherzige das bitte! Solange du das nicht machst, bin ich aus der Sache raus!
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2008-07-26 15:26.