Anzeige:
Ergebnis 1 bis 10 von 10

Thema: PERL und while Verständigungsprobleme :-(

  1. #1
    Registrierter Benutzer
    Registriert seit
    18.12.2008
    Beiträge
    39

    PERL und while Verständigungsprobleme :-(

    Hallo

    ich habe ein Script erstellt der in einer Datei suchen soll.

    Datei: test.txt sieht so aus:
    Code:
    Name1;Vorname1;Strasse 1
    Name2;Vorname2;Strasse 2
    suchen.pl sieht so aus:
    Code:
    #!/usr/bin/perl 
    
    use strict;
    use warnings;
    
    my $nname = "Name2";
    my $vname = "Vorname2";
    my $strasse = "Strasse 2";
    
    my $alles = "$nname;$vname;$strasse";
    
    my $datei = 'test.txt';
    my $suchen = qr/$alles/i;
    
    open my $inhalt, '<',$datei or die $!;
    while(my $zeile = <$inhalt>){
        if($zeile =~ /$suchen/){
            print $zeile;
        }
    }
    close $inhalt;
    wie kann ich jetzt das gefundene als wert weiter verarbeiten?

    so geht es nicht;
    Code:
    ...
    ...
    while(my $zeile = <$inhalt>){
        if($zeile =~ /$suchen/){
            print $zeile;
            my $gefunden = $zeile;
        }
    }
    close $inhalt;
    
    print $gefunden;
    also, ich möchte das gefundene weiter verarbeiten, wie mache ich das?

    Danke im voraus für Antwort


    LG,
    Roki
    Geändert von Roki (06-06-2010 um 22:16 Uhr)

  2. #2
    Registrierter Benutzer
    Registriert seit
    18.12.2008
    Beiträge
    39
    so funktionierte es;
    Code:
    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    my $gefunden = "";
    my $nname = "Name2";
    my $vname = "Vorname2";
    my $strasse = "Strasse 2";
    
    my $alles = "$nname;$vname;$strasse";
    
    my $datei = 'test.txt';
    my $suchen = qr/$alles/i;
    
    open my $inhalt, '<',$datei or die $!;
    while(my $zeile = <$inhalt>){
        if($zeile =~ /$suchen/){
    #        print $zeile;
    	$gefunden = $zeile;
        }
    }
    close $inhalt;
    print $gefunden;
    kann mir das jemand bitte genauerer erklären? bzw. so einer Art von initialisieren my $var = ""; kenne ich nicht, nur my $var; kenne ich) habe ich nicht verstanden...?

    Danke im voraus

    LG,
    Roki
    Geändert von Roki (06-06-2010 um 22:16 Uhr)

  3. #3
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    my deklariert eine variable für den lokalen block.
    sobald der block, in deinem fall das if verlassen wird, ist die variable nicht mehr da.

  4. #4
    Registrierter Benutzer
    Registriert seit
    18.12.2008
    Beiträge
    39
    Hallo msi,

    Danke!

    das habe ich verstanden, aber warum muss vorher my $gefunden = ""; gesetzt werden(womit es funktioniert), und warum funktioniert es nicht wenn ich vorher ein einfaches my $gefunden; oder mit my ($gefunden, $....); setze ?

    naja, das habe ich mir jetzt für nächstes mal gemerkt....

    LG,
    Roki
    Geändert von Roki (08-06-2010 um 00:41 Uhr)

  5. #5
    Registrierter Benutzer
    Registriert seit
    05.02.2006
    Beiträge
    116
    Was heißt "funktioniert nicht"? Wenn Du die Variable *vor* der while-Schleife deklarierst ( my $gefunden; ), sollte es funktionieren. Die Variable muss nicht initialisiert werden.

    Was passieren kann: Wenn nichts gefunden wird, gibt es eine *Warnung* (kein Fehler) in der irgendwas mit "uninitialized" zu finden ist. Das hat dann damit zu tun, dass $gefunden keinen Wert hat (undef ist).

  6. #6
    Registrierter Benutzer
    Registriert seit
    18.12.2008
    Beiträge
    39
    Was heißt "funktioniert nicht"? Wenn Du die Variable *vor* der while-Schleife deklarierst ( my $gefunden; ), sollte es funktionieren.
    sorry ich dummer! war etwas durcheinander, ich habe es nochmal getestet und auf einmal funktioniert es auch mit my $gefunden; (ohne = "";) (vorher ging das nicht, oder ich habe einfach ; am ende vergessen...)

    DANKE!


    perl bringt meine logik durcheinander
    Code:
    #!/usr/bin/perl -w
    
    use strict;
    
    my $benutzer = "Vorname-Name";
    
    my @trennen = split(/-/, $benutzer);
    
    print @trennen['1']."\n";
    Ausgabe:
    Code:
    Scalar value @trennen['1'] better written as $trennen['1'] at ./test2.pl line 10.
    Name
    [roki@linux perl]$
    anstatt @trennen['1'] sollte man besser $trennen['1'] verwenden.

    noch eine frage:

    wie kann ich zb. den $benutzer, Buchstaben von A-Z und Ziffern von 0-9 und Leerzeichen erlauben und alles andere; (Sonderzeichen wie) "/\=.-)( etc. verbieten?

    so?
    Code:
    $benutzer =~ s/[^-a-zA-Z0-9- -]//go;
    es funktioniert, ich bin mir aber nicht sicher ob das nach 9 also, - - für Leerzeichen richtig ist ?

    und wo mit kann ich Perl Script auf Sicherheitslücken überprüfen?

    Gruss,
    Roki
    Geändert von Roki (14-06-2010 um 18:45 Uhr)

  7. #7
    Registrierter Benutzer Avatar von John W
    Registriert seit
    29.01.2010
    Beiträge
    211
    Ich kann Perl zwar an sich nicht, aber mit @Array spricht man ein ganzes Array an, mit $Array['1'] ein einzelnes Element; @Array['1'] hieße meines (etwas bescheidenden) Wissens nach, dass du ein Array aus einem zweidimensionalen Array lesen willst - da es sich um ein eindimensionales Array handelt, führt er es zwar wie gewünscht aus, weist aber auf den offensichtlichen Programmierfehler hin. (Ich bitte darum, mich zu korrigieren wenn es falsch ist!)

    Der regex, den du suchst, sieht so aus:
    Code:
    ^[a-zA-Z0-9 ]+$
    Wenn das erste und letzte Zeichen kein Leerzeichen sein darf (und mindenstens 3 Zeichen lang sein soll), sieht es so aus:
    Code:
    ^[^ ][a-zA-Z0-9 ]+[^ ]$
    Ohne Mindenstens-3-Zeichen-Regel sähe das dann so aus:
    Code:
    ^([a-zA-Z0-9] *)[a-zA-Z0-9]?$
    Sicherheitslücken kannst nur du (oder andere Leute mit Zugang zum Sourcecode) prüfen; alles, was von außen kommt, muss validiert werden.

  8. #8
    Registrierter Benutzer
    Registriert seit
    18.12.2008
    Beiträge
    39
    Hallo John W !

    Danke!

    ein Beispiel:
    Code:
    #!/usr/bin/perl -w
    
    use strict;
    
    my $Vorname ="Mann ";
    my $Name = "Mueller ";
    
    if($Vorname =~ s/[^a-z-A-Z-0-9 ]//g || $Name =~ s/[^a-z-A-Z-0-9 ]//g) {
    print "Sonderzeichen gefunden!\n";
    exit;
    }
    
    print "Keine Sonderzeichen\n";
    ..hier kann ich dann weiter machen, oder?
    außer a-z-A-Z-0-9 und Leerzeichen ist nichts anderes erlaubt, das müsste doch für die Sicherheit reichen, oder?

    wenn ich zb. bei $Vorname noch "/" hinzufüge
    Code:
    my $Vorname ="Mann /";
    Ausgabe:
    Code:
    Sonderzeichen gefunden!
    das gleiche passiert auch mit ";" ...

    Gruss,
    Roki
    Geändert von Roki (16-06-2010 um 20:01 Uhr)

  9. #9
    Registrierter Benutzer Avatar von John W
    Registriert seit
    29.01.2010
    Beiträge
    211
    Es kommt immer darauf an, wo die Benutzereingaben hingehen.
    Aber nur mit alphanumerischen Zeichne plus Leerzeichen lässt sich wohl eher nicht viel machen (und wenn, würde es wohl zu kompliziert werden, als dass es jemand versuchen würde).

    Generell ist Sicherheit ja eher das Verhältnis von aufzubringendem Aufwand zu Ehrgeiz eines Angreifers, damit dürfte die hier recht groß sein.

  10. #10
    Registrierter Benutzer
    Registriert seit
    18.12.2008
    Beiträge
    39
    Hallo John W,

    Zitat Zitat von John W Beitrag anzeigen
    Es kommt immer darauf an, wo die Benutzereingaben hingehen.
    es geht nicht in der Datenbank (mysql etc.)

    Aber nur mit alphanumerischen Zeichne plus Leerzeichen lässt sich wohl eher nicht viel machen
    eben... :-)

    Danke!

    Gruss,
    Roki

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •