Schrift
[thread]7958[/thread]

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

Leser: 1


<< |< 1 ... 3 4 5 6 7 >| >> 63 Einträge, 7 Seiten
bloonix
 2006-05-14 23:26
#65857 #65857
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=Strat,14.05.2006, 21:23]genau, wobei ich bei kritischen sachen auch die returncodes von print und konsorten ueberpruefe...[/quote]
wenn print nicht mehr schreiben kann, wird dann nicht sowieso ein "die"
ausgelöst? oder nur ein "warn"?
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.
Strat
 2006-05-14 23:33
#65858 #65858
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
das geschieht nicht automatisch, sondern - wie fast ueberall in perl - nur, wenn man sich selbst drum kuemmert.

Code: (dl )
print "xzy\n" or die "Error: couldn't print: $!\n";

z.B. wenn platte voll; bei pipe-open kann sowas einfacher passieren.\n\n

<!--EDIT|Strat|1147635356-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
ptk
 2006-05-15 00:50
#65859 #65859
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
@opi: Wenn man es automatisch haben will, kann man "use Fatal (...)" verwenden.

@strat: Reicht ein "close or die" nicht aus? Wenn vorher beim print nicht geschrieben werden konnte, wird wohl auch der letzte Flush fehlschlagen, oder?
betterworld
 2006-05-15 03:24
#65860 #65860
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=ptk,14.05.2006, 22:50]@strat: Reicht ein "close or die" nicht aus? Wenn vorher beim print nicht geschrieben werden konnte, wird wohl auch der letzte Flush fehlschlagen, oder?[/quote]
Wenn man in die Datei z. B. genau 4096 Bytes (oder wie groß der Puffer auch sein mag) hineinschreibt, bleibt fuer close nichts mehr zu flushen. Oder wenn autoflush gesetzt ist.

Und selbst wenn length("xyz\n") kleiner als 4096 ist, sollte man beachten, dass moeglicherweise irgend wann jemand mal den Code editiert und die Meldung verlaengert.

Oder aber ein print koennte fehlschlagen, weil das Dateisystem voll ist, und bis zum close ist wieder Platz da.

Wie auch immer, meiner Meinung nach sollte man Fehler ueberall da testen, wo sie auftreten koennen. Man kann gar nicht oft genug nach Fehlern pruefen.\n\n

<!--EDIT|betterworld|1147649825-->
Strat
 2006-05-15 22:30
#65861 #65861
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
@ptk: das reicht oft schon; nur kann es manchmal hilfreich sein, wenn man das problem schon vor dem close erkennt (z.B. bei daemons)
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
betterworld
 2006-07-09 20:11
#65862 #65862
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Anscheinend wurde in diesem Thread beschlossen, dass es sicher ist, so zu schreiben:
Code: (dl )
1
2
3
4
5
6
sub foo {
local ($_);
while (<>) {
mach_was_mit($_);
}
}


Aber weit gefehlt! Zusammen mit pq habe ich gerade herausgefunden, dass folgender Code sich äußerst seltsam verhält:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
sub foo {
local ($_);
while (<>) {
chomp;
print "ich habe $_ gelesen\n";
}
}

foo for $1;
print "ende\n";

Wenn man dieses Programm in perl 5.8.8 startet und z. B. "test" eingibt, wird nicht etwa "ich habe test gelesen" ausgegeben, sondern sofort "ende". In perl 5.9.3 hingegen wird abgebrochen mit "Modification of a read-only value attempted at - line 3."

In perlsub steht dazu
Quote
If you localize a special variable, you'll be giving a new value to it,
but its magic won't go away. That means that all side-effects related
to this magic still work with the localized value.

...

the following snippet will die in perl 5.9.0 :

sub f { local $_ = "foo"; print }
for ($1) {
# now $_ is aliased to $1, thus is magic and readonly
f();
}

...

Notably, if you want to work with a brand new value of the default
scalar $_, and avoid the potential problem listed above about $_ previ-
ously carrying a magic value, you should use "local *_" instead of
"local $_".


Ich finde es eigentlich nicht sehr einsichtig. Denn $1 ist zwar eine Spezialvariable, aber $_ nicht. Und wenn $_ ein Alias auf $1 ist, sollte das mit einem local() eigentlich aufhebbar sein.

Und das wirklich merkwürdige Verhalten von 5.8.8 kann ich mir auch nicht erklären.
pq
 2006-07-09 20:20
#65863 #65863
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
ich finde das verhalten auch nicht logisch, aber ich finde auch, die stelle, die
"schuld" ist, ist for ($1). ich bin immer vorsichtig mit $1. auch wenn
ich $1 an subroutinen übergebe. dann schreibe ich immer foo("$1")

edit: demo:
Code: (dl )
1
2
3
4
5
6
sub foo {
"foo" =~ m/(oo)/;
print "foo(@_)";
}
"test" =~ m/(es)/;
foo($1); # gibt 'oo' aus und nicht 'es'
\n\n

<!--EDIT|pq|1152462348-->
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-07-09 20:25
#65864 #65864
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=pq,09.07.2006, 18:20]auch wenn
ich $1 an subroutinen übergebe. dann schreibe ich immer foo("$1")[/quote]
Nur wird es hier ja nicht übergeben, sondern in die globale Müllhalde eingelagert.
pq
 2006-07-09 20:28
#65865 #65865
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
wenn ich unbedingt ein for ($1) brauche (könnt ich mir jetzt
nicht vorstellen), dann würde ich $1 erstmal an eine variable zuweisen
oder einfach for ("$1") schreiben.\n\n

<!--EDIT|pq|1152462628-->
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-07-10 15:24
#65866 #65866
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
$1 usw verwende ich nur selten ausserhalb einer RE, ich versuche, wenn moeglich, auf
Code: (dl )
if (my ($elem1, $elem2, @x) = $string =~ /.../ ) {

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



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