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

Perl Script erst nach aufforderung beenden (Seite 2)

Leser: 2


<< |< 1 2 3 >| >> 29 Einträge, 3 Seiten
krusty
 2006-05-10 11:01
#65888 #65888
User since
2006-01-27
91 Artikel
BenutzerIn
[default_avatar]
Irgendwie blicke ich das immernoch nicht.

So sieht der Code bei mir aus. Wenn ich eine falsche IP angebe, z.B. mit 4 Stellen in einem Octet dann wird diese trotzdem als richtig anerkannt. Das selbe ist bei einer die 3 oder weniger Stellen pro Octet hat.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
my $range;
{
do
{
print "Die Eingabe war ungueltig -- " if (defined $range);
print "Wrong IP-range. Enter right IP-range e.g. 192.168.2.0!\nIP-range: ";
$range = <STDIN>;
}
while (not ($range =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/));
print "Die korrekte Eingabe war: $range\n";
}


Der einzige unterschied zwischen deinem Vorschlag und meiner Umsetzung ist der, das ich die Variable $range vor der Schleife initialisiere. Dies ist nötig, damit ich die Variable auch nach der Schleife verwenden kann. Ist doch richtig oder?
Any ideas???\n\n

<!--EDIT|krusty|1147244658-->
nepos
 2006-05-10 12:25
#65889 #65889
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Eventuell solltest du die Regex noch so umbauen:
Code (perl): (dl )
$range !~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/

Da ist das ungleich gueltiger Adresse gleich im !~ drin und es matchen nur Strings, die mit ner Zahl anfangen und auch entsprechend enden.
Vorteil der do-Variante ist, dass der Code mindestens einmal ausgefuehrt wird unabhaengig davon, wie du $range initialisiert hast.
bo
 2006-05-10 12:28
#65890 #65890
User since
2006-05-09
76 Artikel
BenutzerIn
[default_avatar]
bastel das mal rein, dann müsste es funktionieren...
Code: (dl )
1
2
3
4
5
$range =~ s/^\s*// && s/\s*$//;
if ($range =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/)
{
# ip ok
}
Relais
 2006-05-10 13:01
#65891 #65891
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das hier könnte da auch nützlich sein, wenn man's nicht von Hand machen will, oder auch nur zum Spicken: CPAN:Regexp::Common::net -provide regexes for IPv4 addresses.
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
krusty
 2006-05-10 13:09
#65892 #65892
User since
2006-01-27
91 Artikel
BenutzerIn
[default_avatar]
Jetzt bin ich irgendwie total durch den Wind. :rock:
Kann man das nicht über meinen Ansatz lösen. Mit den ganzen regex Teilen kapiere ich gar nix mehr. Sorry, aber das ist irgendwie noch zu hoch für mich.

Nur nochmal zur erinnerung, hatte zu Anfang sowas hier:
Code: (dl )
1
2
3
4
5
6
while ( $range =~ /\d+\.\d+\.\d+\.\d+/ )
{
print "Enter the iprange e.g. 192.168.2.0!\n";
print "IP-range: ";
$range = <STDIN>;
}
bo
 2006-05-10 13:15
#65893 #65893
User since
2006-05-09
76 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
7
my $range = qw(192.168.2.0);
while ($range =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/)
{
print "Enter the iprange e.g. 192.168.2.0!\n";
print "IP-range: ";
$range = <STDIN>;
}


hier ist $range vorinitialisiert...
so müsste es auch gehen...
krusty
 2006-05-10 13:21
#65894 #65894
User since
2006-01-27
91 Artikel
BenutzerIn
[default_avatar]
habe das jetzt so gemacht:

Code: (dl )
1
2
3
4
5
6
7
8
print "Enter the IP-range e.g. 192.168.2.0!\n";
print "IP-range: ";
my $range = <STDIN>;
while ($range =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/)
{
print "Wrong IP-range. Enter right IP-range e.g. 192.168.2.0!\nIP-range: ";
$range = <STDIN>;
}


Jetzt bleibe ich immer in der schleife egal ob richtig oder nicht. *grrrml*
bo
 2006-05-10 13:38
#65895 #65895
User since
2006-05-09
76 Artikel
BenutzerIn
[default_avatar]
dann so rum... :)

Code: (dl )
1
2
3
4
5
6
7
8
print "Enter the IP-range e.g. 192.168.2.0!\n";
print "IP-range: ";
my $range = <STDIN>;
while ($range !~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/)
{
print "Wrong IP-range. Enter right IP-range e.g. 192.168.2.0!\nIP-range: ";
$range = <STDIN>;
}
AndreasM
 2006-05-10 13:45
#65896 #65896
User since
2005-10-08
31 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo,
bei <STDIN> darfst Du nicht vergessen: es wird immer noch die Entertaste gedrückt, was in der Regel einen Newlinezeichen ("\n") entspricht. Mit 'chop' oder 'chomp' kannst Du es entfernen.
'chop' entfernt rigoros das letzte Zeichen und liefert es als Ergebnis zurück.
'chomp' entfernt Newlinezeichen am Ende eines Strings und liefert als Ergebnis die Anzahl der entfernten Zeichen zurück.

Für Deine Zwecke reicht ein 'chomp $range;'

Versuch's mal so:

$range=0;
while ($range !~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/)
{
print "Enter right IP-range e.g. 192.168.2.0!\nIP-range: ";
$range = <STDIN>;
chomp $range;
if ($range !~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/){print print "Wrong IP-range.\n"}
}


$range ist erstmal null.
Dann kommt die while-Schleife mit einer regex-Prüfung.
Da gibt es nicht nur =~ um etwas zu finden, sondern auch !~ um etwas NICHT zu finden.
Weil die Regex nicht passt springt das Skript in die Weilschleife und erwartet eine erste Eingabe. Ist die fehlerhaft gibt es eine Meldung und die while-Schleife wird neu durchlaufen.

Grüße
AndreasM

P.S. Ob !~ syntaktisch richtig ist weiss ich nicht aus dem Kopf. Ich habe die Negierung einer Regex aber schon genutzt. Es geht :)
Alternativ: statt 'while' und Regexnegierung 'unless' und Regex

P.P.S. Der Ausdruck zur syntaktischen Prüfung einer IP-Adresse ist etwas schlicht. er lässt ja auch 666.666.666.666 zu, was aber verboten ist. Auch eine '192.168.1.0' ist gültig, aber genaugenommen ein Broadcast.

P.P.P.S. Jetzt habe ich eben noch Blödsinn geschrieben:
$range = chomp <STDIN> funktioniert nicht, weil chomp ja als Ergebnis die Anzahl der entfernten Zeichen zurückgibt. Du hä#ttest als Ergebnis immer '1'\n\n

<!--EDIT|AndreasM|1147255180-->
krusty
 2006-05-10 13:59
#65897 #65897
User since
2006-01-27
91 Artikel
BenutzerIn
[default_avatar]
So es funktioniert jetzt mit der Negierung. Vielen vielen Dank.
Wenn ich euch mal treffen sollte gebe ich nen Bier aus. ;)

Mit unless funzt das auch gut. Danke auch an die wirklich gute erklärung. hast mir einige Stunden lese arbeit gespart. :)

Seid ne super community. weiter so.
<< |< 1 2 3 >| >> 29 Einträge, 3 Seiten



View all threads created 2006-05-09 23:07.