Schrift
[thread]7958[/thread]

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

Leser: 1


<< |< 1 2 3 4 5 6 7 >| >> 63 Einträge, 7 Seiten
bloonix
 2006-05-10 18:07
#65827 #65827
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=pq,10.05.2006, 15:59]anscheinend nicht[/quote]
sowas schreibe ich nicht einfach so daher.
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 18:38
#65828 #65828
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=opi,10.05.2006, 15:14]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... :)[/quote]
Wie ich schon sagte: Es geht nur um eine ganz bestimmt Schleife. For-Schleifen machen ueberhaupt kein Problem, auch wenn sie implizit $_ verwenden. Denn sie lokalisieren $_.
pq
 2006-05-10 18:53
#65829 #65829
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=opi,10.05.2006, 16:07][quote=pq,10.05.2006, 15:59]anscheinend nicht[/quote]
sowas schreibe ich nicht einfach so daher.[/quote]
beispiel: ich benutze $_ in meinem code, etwa mit
Code: (dl )
1
2
3
4
5
6
7
8
9
for (@array) {
 deine_funktion();
 print "item $_\n"; # $_ ist leer!
}

sub deine_funktion {
 # ...
 print while <$fh>;
}


dann steht in $_ nach aufruf der funktion nicht mehr das, was vorher
drinstand.

(ich müsste auch mal meinen code auf solche fallen untersuchen...)
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-11 09:57
#65830 #65830
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
wird dieser Bug mit Perl6 behoben sein?
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.
bloonix
 2006-05-11 10:06
#65831 #65831
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=pq,10.05.2006, 16:53](ich müsste auch mal meinen code auf solche fallen untersuchen...)[/quote]
in htc hab ich gestern schon reingesehen... du benutzt
keine while schleifen ;)

aber du hast ja mehr als ein modul...\n\n

<!--EDIT|opi|1147327616-->
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-11 12:37
#65832 #65832
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=opi,11.05.2006, 07:57]wird dieser Bug mit Perl6 behoben sein?[/quote]
na, bei perl6 mit sicherheit, perl6 wird ja komplett neu geschrieben.
mich würde eher interessieren, ob es in perl5 noch irgendwann behoben wird.
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
Strat
 2006-05-11 16:55
#65833 #65833
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
ich sehe das nicht als bug, sondern als feature

bei for(each) .... (@array)

bildet die laufvariable einen alias auf das element des arrays, ueber das gerade iteriert wird, und nach ende der schleife wird $_ wiederhergestellt, z.B.
Code: (dl )
1
2
3
4
5
6
use warnings; use strict;
my @array = 1..20;
$_ = 'xxx';
print "before: $_\n";
for (@array) { print "Zahl: $_\n" }
print "after: $_\n";


wenn man aber eine while-schleife mit Laufvariable haben will, dann die immer lokalisieren (mit my oder bei $_ mit local). Wenn man z.B schreibt
Code: (dl )
1
2
3
4
5
$_ = 0;
while ($_ < 20) {
print "$_\t";
$_++;
}

hat man ja dasselbe problem. es heisst ja while ( BEDINGUNG ), und wenn man diese Bedingung missbraucht, um eine Laufvariable zu bekommen, muss man selbst die verantwortung fuer die laufvariable uebernehmen.\n\n

<!--EDIT|Strat|1147352219-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
pq
 2006-05-11 17:02
#65834 #65834
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Strat,11.05.2006, 14:55]es heisst ja while ( BEDINGUNG ), und wenn man diese Bedingung missbraucht, um eine Laufvariable zu bekommen, muss man selbst die verantwortung fuer die laufvariable uebernehmen.[/quote]
stimmt, das leuchtet ein =)
aber irgendwie denkt man nie dran, $_ extra zu lokalisieren dafür, ich
zumindest nicht.
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
betterworld
 2006-05-11 17:15
#65835 #65835
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Wird denn irgendwo in der Dokumentation darauf hingewiesen, dass man selbst lokalisieren muss?

Opis Code von oben tut dies jedenfalls nicht.
Strat
 2006-05-11 18:07
#65836 #65836
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
@betterworld: ich glaube nicht, da es sich dabei ja um keinen sonderfall handelt. Der Sonderfall ist die for(each)-Schleife, und da ist es dokumentiert.

Eine while-schleife ist ja im grunde nur ein if-block, der wiederholt ausgefuehrt wird (solange halt die bedingung wahr ist) Und bei einem if ( BEDINGUNG ) ist es ja auch klar, dass man, wenn man einen lokalen wert verwenden will, diesen selbst lokalisieren muss, z.B.
Code: (dl )
if( my $x = &SubBlabla(@params) ) {

wird's jetzt klara?\n\n

<!--EDIT|Strat|1147356768-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< |< 1 2 3 4 5 6 7 >| >> 63 Einträge, 7 Seiten



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