PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PERL und while Verständigungsprobleme :-(



Roki
06-06-2010, 21:39
Hallo

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

Datei: test.txt sieht so aus:

Name1;Vorname1;Strasse 1
Name2;Vorname2;Strasse 2

suchen.pl sieht so aus:

#!/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;

...
...
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

Roki
06-06-2010, 22:13
so funktionierte es;


#!/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

msi
06-06-2010, 23:57
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.

Roki
08-06-2010, 00:22
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

reneeb
08-06-2010, 06:31
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).

Roki
14-06-2010, 18:33
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:confused:

#!/usr/bin/perl -w

use strict;

my $benutzer = "Vorname-Name";

my @trennen = split(/-/, $benutzer);

print @trennen['1']."\n";



Ausgabe:

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. :confused:

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?

$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

John W
15-06-2010, 10:13
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:
^[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:
^[^ ][a-zA-Z0-9 ]+[^ ]$Ohne Mindenstens-3-Zeichen-Regel sähe das dann so aus:

^([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.

Roki
16-06-2010, 19:44
Hallo John W ! :)

Danke!

ein Beispiel:

#!/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


my $Vorname ="Mann /";


Ausgabe:


Sonderzeichen gefunden!


das gleiche passiert auch mit ";" ...

Gruss,
Roki

John W
16-06-2010, 19:57
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.

Roki
17-06-2010, 08:04
Hallo John W,


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