Thread Kommaseparierte Listen bereichsweise ausgeben. (28 answers)
Opened by Gast at 2006-04-14 16:54

sid burn
 2006-04-15 06:24
#64966 #64966
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
[quote=murphy,15.April.2006, 03:29]...und zum anderen werden logische Ausdrücke im Kurzschlussverfahren ausgewertet, weshalb alles nach && nicht ausgeführt wird, wenn nicht die Mustersuche Erfolg vermeldet.[/quote]
Stimmt, an der Tatsache habe ich gar nicht mehr dran gedacht.

Quote
- Der reguläre Ausdruck, den du verwendest um die Eingabezeilen auszuwerten, funktioniert, denke ich, nicht immer. Zum Beispiel kriegst du da Probleme, wenn eine Variable in deinen Eingabezeilen 'foo' heißt und jemand an der Kommandozeile angibt, dass nach 'o' gesucht werden soll. Dann erwischt dein regulärer Ausdruck immer auch 'foo'...

Aber nein das stimmt so nicht. Nur wenn hinter "foo" ein Gleichheitszeichen steht, und dahinter sofort eine Zahl folgt.

Zum anderen muss ich hier aber auch sagen das dies kein Problem der Regex ist, sondern eher das man hier eine unüberprüfte Eingabe eines Benutzers weiter verwendet.


Wenn man diese noch zusätzlich auf richtigkeit überprüfen möchte, dann sollte man dies direkt nach der Variablendeklaration mit my tun. Und dann alles Angeben was ein benutzer eingeben darf. Hier wäre das a,b,c,d. Man sollte also folgende Zeile hinzufügen.

Code: (dl )
die "Erstes Argument muss [a-d] sein\n"    unless $key =~ m/^[a-d]$/;


Wenn man Groß Kleinschreibung erlauben möchte dann entweder hier und in der Regex die Option /i anhängen, oder aber was ich empfehle oben /i benutzen, und $key dann mit "lc" in kleine buchstaben umwandeln. (Macht die untere Regex Performanter) Da in den Daten ja auch nur kleinbuchstaben vorkommen, würde das gehen.


-----------
Wenn ich das also nochmal zusammenfassen darf. Kann man es also so schreiben.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl -w

use strict;

die "$0: VALUE MIN MAX\n" if @ARGV != 3;
my ($key, $min, $max) = @ARGV;
die "Erstes Argument muss [a-d] sein!\n" unless $key =~ m/^[a-d]$/i;
$key = lc $key;

open LISTE, "<", "liste.txt" or die $!;
while ( <LISTE> )
{
if ( m/$key=(\d+)/o && $1 >= $min && $1<= $max )
{
print;
}
}
close LISTE;


Allerdings würde ich die Überprüfung von $1 trotzdem im if Block schreiben, dass schaut mir irgendwie zu unübersichtlich aus.

Von der Performance her sollte es eigentlich egal sein? Da bei den gleichen Daten letztendlich bei beiden Schreibweisen die gleichen Bedingung überprüft werden müssen.

Allerdings würde ich das ganze auch mit "while ( <> ) { ... }" machen, anstatt eine Datei hart zu codieren.\n\n

<!--EDIT|sid burn|1145069426-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de

View full thread Kommaseparierte Listen bereichsweise ausgeben.