Schrift
[thread]7958[/thread]

Tiefe Hash Strukturen aus Config bilden: Und warum while(<FH>) gefährlich ist (Seite 2)

Leser: 1


<< |< 1 2 3 4 5 ... 7 >| >> 63 Einträge, 7 Seiten
bloonix
 2006-05-10 12:45
#65817 #65817
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=murphy,10.05.2006, 02:30]@opi: Ich finde den Code prinzipiell völlig in Ordnung, aber ich würde es rein geschmacklich vorziehen, nicht für jeden Konfigurationsschlüssel den vollen "Pfad" in den verschachtelten Hash angeben zu müssen. So etwas ähnliches wie die YAML-Syntax für Hashes fände ich hübscher.[/quote]
du meinst untereinander mit einrückung statt in einer zeile?

ich habe mein beispielkonstrukt in my.cnf gesehen und fand es
irgendwie klasse. wenn man solch eine konfig manuell editiert,
können auch weniger fehler passieren. das ist auch der
hintergrund... es wird eine konfigurationsdatei, die manuell
editiert und auch von skripts geändert wird.

ist YAML nicht ziemlich verbuggt? irgendwer hier im forum hat
das mal behauptet...
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
pq
 2006-05-10 13:35
#65818 #65818
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=opi,10.05.2006, 10:11]nach der for-schleife ist $_ leer[/quote]
eben, genau das ist das problem.
Code: (dl )
1
2
3
4
5
6
7
8
perl -we'$_="test";print while <>;print "\$_:$_\n"'
a
a
b
b
<CTRL-D>
Use of uninitialized value in concatenation (.) or string at -e line 1, <> line 2.
$_:

es sollte aber "test" drinstehen.
das ist ein bug, der schon ziemlich lange existiert, und ich hatte ihn schon
längst verdrängt, bis betterworld darauf aufmerksam machte.\n\n

<!--EDIT|pq|1147254023-->
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
pq
 2006-05-10 13:39
#65819 #65819
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=opi,10.05.2006, 10:45]ist YAML nicht ziemlich verbuggt? irgendwer hier im forum hat
das mal behauptet...[/quote]
ja, YAML hat bugs. solange du einfache konfigurationsdateien hast, sollte
aber alles in ordnung sein.
es geht um so sachen wie '-' in hash keys, sowas wird dann nicht korrekt
serialisiert.
genaueres kannst du rt.cpan.org entnehmen.
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
bloonix
 2006-05-10 14:47
#65820 #65820
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=pq,10.05.2006, 11:35]
Code: (dl )
perl -we'$_="test";print while <>;print "\$_:$_\n"'
[/quote]
aber wird $_ durch die while-Schleife nicht überschrieben?

print $_:$_ müsste doch eigentlich "b:b" ausgeben,
weil "b" das letzte Zeichen ist, welches du eingegeben hast
und in $_ stand...

wo ist hier mein denkfehler?
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
pq
 2006-05-10 16:05
#65821 #65821
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=opi,10.05.2006, 12:47]
aber wird $_ durch die while-Schleife nicht überschrieben?

print $_:$_ müsste doch eigentlich "b:b" ausgeben,
[/quote]
nein, wenn es ordentlich local()isiert wäre (wie bei for @array), dann
müsste danach in $_ "test" stehen.\n\n

<!--EDIT|pq|1147262761-->
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
bloonix
 2006-05-10 16:25
#65822 #65822
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=pq,10.05.2006, 14:05]local()...[/quote]
wußte nicht, das es local()isiert wird!! jetzt verstehe ich auch
den bug... aber da ich $_ immer nur in Schleifen verwende,
kann doch eigentlich nicht passieren oder?

ausser ich verwende sowas wie

Code: (dl )
1
2
3
foreach (1,2,3) {
  foreach (1,2,3) {
     foreach (1,2,3) {


dann greife ich nur auf $_ in der innersten Schleife.

Das Problem hatte ich nämlich mal... ich wollte auf $_ nach
einer inneren Schleife zugreifen und $_ war undef.\n\n

<!--EDIT|opi|1147266935-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
pq
 2006-05-10 16:50
#65823 #65823
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=opi,10.05.2006, 14:25]wußte nicht, das es local()isiert wird!! jetzt verstehe ich auch
den bug... aber da ich $_ immer nur in Schleifen verwende,[/quote]
es geht nicht darum, wo dir etwas passieren kann. es geht darum, dass
dein obiger code evtl. programme anderer leute kaputtmacht, wenn sie
ihn benutzen.
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
bloonix
 2006-05-10 17:14
#65824 #65824
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=pq,10.05.2006, 14:50]dass dein obiger code evtl. programme anderer leute kaputtmacht[/quote]
na dieses Risiko geht dann wohl jeder ein, der Module schreibt
und einbindet, denn die verwendung von $_ in Schleifen finde
ich in fast jedem Modul... :)

aber ich habe es verstanden. danke für deine erklärung.
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
betterworld
 2006-05-10 17:24
#65825 #65825
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=opi,10.05.2006, 10:11]verständlich. wie meinst du das denn genau mit unsauber?

Code: (dl )
1
2
3
4
5
for (1,2,3) { }

s//test/;

print "$_\n";


nach der for-schleife ist $_ leer[/quote]
Es geht aber nicht um for-Schleifen, sondern um while-Schleifen. Genauer gesagt um while(<$fh>)-Schleifen. Du koenntest stattdessen
Code: (dl )
while(defined(local($_=<$fh>)))
schreiben.

Nach einer while(<$fh>)-Schleife ist $_ immer undef. Es sei denn, die Schleife wurde mit "last" oder "goto" oder so verlassen. In dem Fall ist $_ die zuletzt eingelesene Zeile. Und das wirkt sich global aus, d. h. auch auf aufrufende Funktionen.
pq
 2006-05-10 17:59
#65826 #65826
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=opi,10.05.2006, 15:14]aber ich habe es verstanden.[/quote]
anscheinend nicht. siehe betterworlds erklärung.
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
<< |< 1 2 3 4 5 ... 7 >| >> 63 Einträge, 7 Seiten



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