Schrift
[thread]7958[/thread]

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

Leser: 1


<< |< 1 2 3 4 5 6 7 >| >> 63 Einträge, 7 Seiten
bloonix
 2006-05-14 16:05
#65847 #65847
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=Strat,14.05.2006, 13:22]genauso wie das Problem mit den globalen FILEHANDLE's[/quote]
hallo strat, das verstehe ich nicht ganz. welche probleme kann es da
geben? ich habe mal folgendes ausprobiert...

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
package TestModul;

sub do_open {
local $_;
open FH,'<','./test.txt' or die $!;
while (<FH>) {
print;
}
close FH;
}

1;


Code: (dl )
1
2
3
4
5
6
7
8
9
10
use TestModul;

open FH,'<','./test.txt' or die $!;

while (<FH>) {
TestModul->do_open;
print;
}

close FH;


ich konnte keine probleme feststellen.
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 16:10
#65848 #65848
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
sowas macht z.B. Probleme
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
open( FH, $file1 ) or die $!;
my $filter = &GetFilter($filterFile);
my @lines = <FH>;
close( FH );

sub GetFilter {
my ($file) = @_;
open( FH, $file) or die $!; # schliesst das aeussere FH
my $filter = <FH>;
close(FH);
return $filter;
}


bei dir tritt das problem nicht auf, weil du unterschiedliche FHs verwendest (einmal TestModul::FH und main::FH)\n\n

<!--EDIT|Strat|1147608775-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
bloonix
 2006-05-14 16:14
#65849 #65849
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
@strat, aber trotzdem sollte man my $FH; benutzen? Was würde
dafür sprechen?

Edit: bezogen auf modul+skript\n\n

<!--EDIT|opi|1147610249-->
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.
renee
 2006-05-14 16:32
#65850 #65850
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@opi: Damit wären sie lokalisiert. Bei gleicher Benennung wäre es aber etwas ganz anderes. Jeder Filehandle ist in einem anderen Scope. Ohne das lokalisieren könnte folgendes passieren:

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

use strict;
use warnings;

open(FH,"test.txt") or die $!;
while(<FH>){
methode();
}
close FH;

sub methode{
open(FH,"test2.txt") or die $!;
close FH;
}


Ausgabe:
Code: (dl )
1
2
C:\Perl\community\studium>fileh.pl
readline() on closed filehandle FH at C:\Perl\community\studium\fileh.pl line 8.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
bloonix
 2006-05-14 16:36
#65851 #65851
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
hallo renee :)

das habe ich verstanden. meine frage bezog sich auf mein beispiel mit
dem modul + skript. das das filehandle geschlossen wird, wenn die sub
im skript selbst ist, ist mir klar. aber was würde dafür sprechen, my $FH;
in einem Modul zu nutzen? welche probleme erwarten den modulbenutzer,
wenn ein open FH verwendet wird?\n\n

<!--EDIT|opi|1147610370-->
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.
renee
 2006-05-14 16:45
#65852 #65852
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Achso, wie Strat schon geschrieben hat, sind es verschiedene Namespaces, so dass es zu keinen Komplikationen kommen sollte. Ein $FH hat den Vorteil, dass der Filehandle relativ früh automatisch geschlossen wird, sobald das $FH aus dem Gültigkeitsbereich kommt.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
bloonix
 2006-05-14 16:49
#65853 #65853
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
ACK

dieser thread hat mir mal wieder sehr gut weitergeholfen! =)
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 19:24
#65854 #65854
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
wie renee schon sagte, wird ein $FH automatisch geschlossen, wenn die Variable $FH aus dem scope faellt und aufgeraeumt wird. Ich halte es aber fuer eine gute Idee, da trotzdem noch ein close($FH); hinzuschreiben, damit jemand, der den code mal wartet/erweitert, nicht mal auf den gedanken kommt, dass dieses auto-schliessen vielleicht unabsichtlich passiert und somit auf einen potentiellen bug hindeutet.

hoechstens in situationen wie dem folgenden wuerde ich vermutlich das auto-close in anspruch nehmen:
Code: (dl )
1
2
3
4
5
my $content = do {
local $/; # slurp mode
open (my $FH, "<", $file) or die "Error in reading file '$file': $!\n";
<FH>;
}; # do
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
ptk
 2006-05-14 20:14
#65855 #65855
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Beim Schreiben einer Datei kann man mit einem expliziten close() nochmal prüfen, ob tatsächlich alles geschrieben wurde:
Code: (dl )
close $fh or die $!
.
Strat
 2006-05-14 23:23
#65856 #65856
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
genau, wobei ich bei kritischen sachen auch die returncodes von print und konsorten ueberpruefe...
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.