Schrift
[thread]7895[/thread]

Kommaseparierte Listen bereichsweise ausgeben. (Seite 3)

Leser: 1


<< |< 1 2 3 >| >> 29 Einträge, 3 Seiten
sid burn
 2006-04-15 19:53
#64973 #64973
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
[quote=murphy,15.April.2006, 17:27][quote=Ronnie,15.04.2006, 09:39][...]
Das regex-Problem lässt sich einfach beheben in dem man das Komma noch berücksichtigt. Die Verwendung des o-Modifiers wäre möglich und sinnvoll da sich $key nicht ändert wärend der Schleife. Die Idee (<>) zu verwenden habe ich aufgegriffen, deshalb wurde auch das splice nötig.[/quote]
Und was ist mit der Variablen am Zeilenanfang oder mit Leerzeichen vor oder hinter dem Komma oder Gleichheitszeichen? Reale Eingabedaten sind selten perfekt formatiert, also würde ich auf Nummer sicher gehen und den folgenden regulären Ausdruck verwenden:
Code: (dl )
m/(^|,)\s*$key\s*=\s*(\d+)/
[/quote]
Hmm, und was ist wenn ich "Hallo Welt wie geht es" als erstes Argument eingebe?

Also ich würde das schon so machen das ich nur ein Buchstabe a-d erlaube. Das was ihr beide da macht, löst das Problem auch nicht wirklich. Da die Benutzereingabe immer noch nicht überprüft wurde.

Code: (dl )
1
2
3
4
5
6
...
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;
...


Quote
ich denke gerade an die tatsache, dass gerade schon wieder
ein akkusativ für ein dativ geopfert wurde... SCNR =)

Höh? ^^
Wörter am Satzanfang werden übrigens groß geschrieben.\n\n

<!--EDIT|sid burn|1145116707-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
pq
 2006-04-15 19:53
#64974 #64974
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=murphy,15.04.2006, 17:28]... für einen Dativ geopfert ... ;-P[/quote]
aua... ich wollte nur mal sehn, ob jemand aufpasst =)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Ronnie
 2006-04-15 20:28
#64975 #64975
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=murphy,15.04.2006, 17:27]Und was ist mit der Variablen am Zeilenanfang oder mit Leerzeichen vor oder hinter dem Komma oder Gleichheitszeichen? Reale Eingabedaten sind selten perfekt formatiert, also würde ich auf Nummer sicher gehen und den folgenden regulären Ausdruck verwenden:
Code: (dl )
m/(^|,)\s*$key\s*=\s*(\d+)/
[/quote]
murphy++
an den Zeilenanfang hatte ich gar nicht mehr gedacht :(

@sid burn: Klar kann, oder muss man (je nachdem wer so ein Skript hinterher verwendet) Benutzereingaben prüfen. Ich bin aber nicht dazu bereit bei jedem kleinen Snippet eine vollständige Validierung der Eingabedaten mit zu liefern. Das bleibt dem Fragesteller als Übungsaufgabe überlassen.\n\n

<!--EDIT|Ronnie|1145119054-->
sid burn
 2006-04-15 20:53
#64976 #64976
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
[quote=Ronnie,15.April.2006, 18:28]@sid burn: Klar kann, oder muss man (je nachdem wer so ein Skript hinterher verwendet) Benutzereingaben prüfen. Ich bin aber nicht dazu bereit bei jedem kleinen Snippet eine vollständige Validierung der Eingabedaten mit zu liefern. Das bleibt dem Fragesteller als Übungsaufgabe überlassen.[/quote]
Bin ich ebenso wenig bereit dafür,
ich finde es aber genauso Sinnlos wenn ihr versucht die regex anzupassen, damit ein paar mögliche Fehleingaben trotzdem Funktionieren, anstatt gleich die Eingabe komplett zu überprüfen.

Zum anderen bastelt ihr so stark an die Regex herum, anstatt einfach eine Zeile für die Eingabeüberprüfung hinzuzufügen.

Die Regex ist ja nicht falsch, sie findet ja was man haben möchte, aber nur bei der Eingabe der Korrekten Daten. Daher finde ich es meiner Meinung nach Sinnlos diese irgendwie anzupassen. Die Wurzel des Übels liegt weiter oben.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
murphy
 2006-04-15 23:56
#64977 #64977
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
@sid burn:

- Mein regulärer Ausdruck funktioniert auch mit dem Variablennamen "Hallo Welt wie geht es" noch einwandfrei.

- Ich finde es deutlich sinnvoller, die eigentliche Programmlogik flexibel zu gestalten, als unnötig restriktive Anforderungen an die Eingabe zu stellen. Soweit es ohne erheblichen Mehraufwand bei der Programmierung realisierbar ist, ziehe ich es stets vor, dem Endbenutzer Freiräume zu lassen.
When C++ is your hammer, every problem looks like your thumb.
murphy
 2006-04-16 00:15
#64978 #64978
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
[quote=murphy,15.04.2006, 20:56][...] Mein regulärer Ausdruck funktioniert auch mit dem Variablennamen "Hallo Welt wie geht es" noch einwandfrei. [...][/quote]
Hier noch ein Beispiel, damit man mir das auch glaubt ;-)

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl

use strict;
use warnings;

# seltsamer Variablenname
my $var = "Hallo Welt, wie geht es dir?";

# irregulaere Eingabedaten
$_ = "a =5 , $var = 42, b=3\n";

print m/(?:^|,)\s*\Q$var\E\s*=\s*(\d+)/, "\n";


Ok, ich habe den Ausdruck noch weiter verfeinert, damit auch Steuerzeichen in der Variablen ignoriert werden -- für sid burns Beispielvariable wäre das nicht nötig gewesen, aber für meine noch dümmere ist es nötig -- und der Schönheit halber nur die zweite Klammer als Zeichengruppe zurückgeliefert wird.

Mit dieser Variante kann man jetzt wirklich so ziemlich jeden Unfug als Variablennamen verwenden und muss dem Benutzer keine Beschränkung auf ein Zeichen auferlegen. Das einzige was ich unterbinden würde, ist die Verwendung eines Gleichheitszeichens im Variablennamen, denn dann könnte man keine eindeutige Interpretation der Eingabedaten mehr gewährleisten.
When C++ is your hammer, every problem looks like your thumb.
sid burn
 2006-04-16 00:47
#64979 #64979
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
@murphy
Ich glaube jetzt reden wir am Thema vorbei. ;)

Es soll ja gerade eben nicht mit "Hallo Welt, wie geht es dir?" funktionieren. Ich muss ja ein Key eingeben. Und die einzigen Keys die in diesen Daten vorkommen sind a,b,c oder d. Von daher sollte man auch nur diese eingaben erlauben. Warum sollte ich Konstrukte wie "??;;"§" oder sonstige Sachen erlauben? Wenn ich ja schon vorher weiß das sie auf meine Daten niemals matchen werden, oder falsche ungewollte Daten liefern könnten?



Und ich hoffe du fast das nicht als böse gemeint auf. Aber:
(?:^|,)

schreibt man besser so:

[,^]\n\n

<!--EDIT|sid burn|1145134200-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
murphy
 2006-04-16 01:09
#64980 #64980
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
[quote=sid burn,15.04.2006, 21:47][...] Es soll ja gerade eben nicht mit "Hallo Welt, wie geht es dir?" funktionieren. Ich muss ja ein Key eingeben. Und die einzigen Keys die in diesen Daten vorkommen sind a,b,c oder d. [...][/quote]
Hmm, ich bin eher davon ausgegangen, dass man das Programm vielleicht so schreiben möchte, dass es nicht nur auf ein ganz spezifisches Problem passt, sondern genereller verwendbar ist. Es mag ja sein, dass im Moment in den Eingabedaten nur die Variablen a, b, c und d vorkommen, aber es ist doch recht wahrscheinlich, dass bei echten Daten mal jemand auf die Idee kommt, eine Variable x, y, time, height oder was weiß ich wie zu nennen.

Ich persönlich versuche außer bei Einzeilern immer so zu programmieren, dass mein Programm möglichst generell verwendbar ist, das zahlt sich spätestens dann aus, wenn man Code für neue Projekte leicht wiederverwenden kann.

Wie auch immer, im Endeffekt muss der OP entscheiden, welchen Weg er einschlagen möchte.

Quote
Und ich hoffe du fast das nicht als böse gemeint auf. Aber:
(?:^|,)

schreibt man besser so:

[,^]


Ich sehe keinen Grund Tipps und Anmerkungen als böse gemeint aufzufassen, eher im Gegenteil. Aber dein Tipp ist leider falsch, denn [,^] matcht auf ein Komma oder einen Circumflex, (?:^|,) macht auf den Anfang des Strings(*) oder ein Komma. Letzteres ist das Verhalten, dass ich programmieren wollte.


(*) ... und/oder auch auf den Anfang einer Zeile, je nach Flags für den regulären Ausdruck.

(edit: komische Formatierung durch das Forum umgangen)\n\n

<!--EDIT|murphy|1145135494-->
When C++ is your hammer, every problem looks like your thumb.
sid burn
 2006-04-16 01:34
#64981 #64981
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Quote
Hmm, ich bin eher davon ausgegangen, dass man das Programm vielleicht so schreiben möchte, dass es nicht nur auf ein ganz spezifisches Problem passt, sondern genereller verwendbar ist. Es mag ja sein, dass im Moment in den Eingabedaten nur die Variablen a, b, c und d vorkommen, aber es ist doch recht wahrscheinlich, dass bei echten Daten mal jemand auf die Idee kommt, eine Variable x, y, time, height oder was weiß ich wie zu nennen.

Sicherlich könnte das sein, aber irgendwie muss ich mich ja entscheiden. Entweder erlaube ich alles, oder nur das was vorgegeben ist. Wenn man alles erlaubt ist es meistens nicht Möglich dafür eine regex zu schreiben. Wenn ich im Value das Komma erlaube, dann habe ich schon wieder größere Probleme, da ich nichtmehr zwichen key und value unterscheiden könnte. (Bei richtigen CSV Dateien ist das durchaus erlaubt, und einfachas spliten nach einen Komma genügt da nicht) Jedenfalls mit diesen simplen regexen würde das nicht gehen. Genauso habe ich Probleme wenn ich auf einmal text anstatt nur Zahlen erlaube.

Wenn man eine Regex schreibt muss man schon genau Wissen mit welchen Daten man es zu tun hat. Wenn man es nicht weiß und die Daten beliebig abweichen, dann ist es fast unmöglich eine Funktionierende Regex zu schreiben. Auser man kennt alle abweichungen.

Bei der Sache mit den neuen Variablen würde ich dann einfach nur meine Überprüfung, was erlaubt ist anpassen. Ich denke das sollte weniger Kompliziert sein. Aber irgendwie muss man trotzdem einschrenken was erlaubt ist, und was nicht.

So sehe ich das jedenfalls.

Quote
Ich sehe keinen Grund Tipps und Anmerkungen als böse gemeint aufzufassen, eher im Gegenteil. Aber dein Tipp ist leider falsch, denn [,^] matcht auf ein Komma oder einen Circumflex, (?:^|,) macht auf den Anfang des Strings(*) oder ein Komma. Letzteres ist das Verhalten, dass ich programmieren wollte.

Ja da hast du wohl recht. Vielleicht sollte ich 2 mal nachdenken bevor ich etwas Schreibe.

Kann aber Trotzdem noch sagen, dass wenn die Reihenfolge einer Alternativen egal ist, man das Konstrukt zuerst schreiben sollte, was öfters vorkommt. Also dann das Komma mit dem zeilenanfang vertauschen. Das ist zumindest etwas Performanter.\n\n

<!--EDIT|sid burn|1145137369-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
<< |< 1 2 3 >| >> 29 Einträge, 3 Seiten



View all threads created 2006-04-14 16:54.