Schrift
[thread]7962[/thread]

Perl Script erst nach aufforderung beenden (Seite 3)

Leser: 2


<< |< 1 2 3 >| >> 29 Einträge, 3 Seiten
krusty
 2006-05-10 15:37
#65898 #65898
User since
2006-01-27
91 Artikel
BenutzerIn
[default_avatar]
Habe schon wieder ein Problem mit den Regulären Ausdrücken. Irgendwie ist das nicht meines. Will jetzt noch eine Benutzereingabe prüfen. Dieses mal sollen nur die beiden Eingaben 27 und 28 gültig sein. Habe dazu folgendes nach dem Muster von AndreasM gemacht:
Code: (dl )
1
2
3
4
5
6
7
8
my $mask=0;
while (($mask != "27") || ($mask != "28"))
{
print "Enter right netmask. Only 27 or 28\nNetmask: ";
$mask = <STDIN>;
chomp $mask;
if (($mask != "27") || ($mask != "28")){print "Wrong netmask.\n"}
}


Leider läuft die Schleife nur noch, nimmt weder 27 noch 28 an.\n\n

<!--EDIT|krusty|1147261842-->
betterworld
 2006-05-10 15:43
#65899 #65899
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=murphy,09.05.2006, 22:04]Sollte das nicht eher
Code: (dl )
1
2
3
4
5
6
7
 {
my $range;
do {
$range = <STDIN>;
} while (not ($range =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/));
...
}
[/quote]
Dieser RE beinhaltet nicht, dass man Nullen in der Mitte weglassen darf.

Vielleicht wird das in Regexp::Common behandelt. Dieses Modul gibt es u. a. genau aus dem Grund, dass sich keiner tagelang Gedanken darueber machen muss, um dann letztendlich doch mit einem inpräzisen Ausdruck anzukommen. So wie hier in diesem Thread. (nichts gegen murphy, ich wollte nur den Ausdruck zitieren)\n\n

<!--EDIT|betterworld|1147261978-->
betterworld
 2006-05-10 15:47
#65900 #65900
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=AndreasM,10.05.2006, 11:45]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.[/quote]
192.168.1.0 ist gewoehnlich kein Broadcast, sondern 192.168.1.255
krusty
 2006-05-10 15:52
#65901 #65901
User since
2006-01-27
91 Artikel
BenutzerIn
[default_avatar]
[quote=betterworld,10.05.2006, 13:47][quote=AndreasM,10.05.2006, 11:45]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.[/quote]
192.168.1.0 ist gewoehnlich kein Broadcast, sondern 192.168.1.255[/quote]
Die Adresse 192.168.2.0 ist die Netzadresse schon richtig und die 192.168.2.255 ist die Broadcast Adresse. Aber das hat leider nichts mit dem Thema zu tun. ;)
bo
 2006-05-10 15:57
#65902 #65902
User since
2006-05-09
76 Artikel
BenutzerIn
[default_avatar]
verwende doch einfach die while-schleife...
Code: (dl )
1
2
3
4
5
6
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 15:57
#65903 #65903
User since
2005-10-08
31 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=krusty,10.05.2006, 13:52][quote=betterworld,10.05.2006, 13:47][quote=AndreasM,10.05.2006, 11:45]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.[/quote]
192.168.1.0 ist gewoehnlich kein Broadcast, sondern 192.168.1.255[/quote]
Die Adresse 192.168.2.0 ist die Netzadresse schon richtig und die 192.168.2.255 ist die Broadcast Adresse. Aber das hat leider nichts mit dem Thema zu tun. ;)[/quote]
Stimmt. Hast recht :)
krusty
 2006-05-10 16:10
#65904 #65904
User since
2006-01-27
91 Artikel
BenutzerIn
[default_avatar]
Habe jetzt folgendes gemacht und es funzt auf anhieb. :D
Code: (dl )
1
2
3
while ($mask !~ /^\d\d$/)
{
}


Wie müsster der Reguläre Ausdruck ausschauen, wenn ich nur auf zwei zahlen prüfen will. Einmal 27 und einmal 28? oder anders wenn ich prüfen will ob die zahl zwei stellen hat?

Wenn ich das mache /^\d{2}$/ geht es nicht!
Matze
 2006-05-10 18:09
#65905 #65905
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
So:
Code: (dl )
1
2
3
$eingabe =~ /^\s*(2[78])\s*$/;
$eingabe = $1;
# wegen \s*, dass heißt, dass auch Platzgelassen werden darf


MfG. Matze
Mit freundlichen Grüßen: Matze
Matze
 2006-05-10 18:19
#65906 #65906
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wenn du viele dieser Eingaben brauchst, lohnt es sich vielleicht
sogar ein kleines Modul dafür zu schreiben, oder wenigstent eine
Funktion.
Das könnte dann ja in etwa so aussehen:
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
# Read("eingabe: ",[regex,regex,rege...],"wrong!")
#
# @args = Read(...);
# $args[-1] = nummer der regex die stimmt(von 0)
# $args[0] = Eingabe des Benutzers
# $args[1] = $1, $args[2] = $2, ...

sub Read {
  my $text = shift;
  my $regex = shift;
  my $wrong = shift;
  my($a,$i,@a);

  while (1) {
    print $text;
    chomp($a = <STDIN>);

    $i = 0;
    foreach my$aa (@{$regex}) {
      if ($a =~ /$aa/) {
        push(@a,$a);

        my @aa = $a =~ m/$aa/;
        push(@a,@aa,$i);

        return @a;
      }
      $i++;
    }

    print "$wrong\n" if $wrong;
  }
}

( nicht getestet! )

MfG. Matze
Mit freundlichen Grüßen: Matze
<< |< 1 2 3 >| >> 29 Einträge, 3 Seiten



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