Schrift
[thread]8382[/thread]

<$fh>

Leser: 1


<< >> 8 Einträge, 1 Seite
Froschpopo
 2006-10-04 05:24
#70451 #70451
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
worin liegt eigentlich der unterschied zwischen <$fh> und <HANDLE> ?

beispiel:

open my $fh.....

wo ist da der unterschied, wenn es im gebrauch doch gleichermaßen verläuft. beides kann ich mit <> durchlaufen.

Ob <$fh> oder <HANDLE> ist doch dasselbe, oder nicht?

wozu brauch man die variable?
topeg
 2006-10-04 07:00
#70452 #70452
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
es gilt:
Code: (dl )
$fh=*HANDLE

damit kannst du sowas machen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
my @dada=my_read($fh,",");
# oder
my @dada=my_read(*HANDLE);
sub my_read($$)
{
my $fh=shift(@_);
local $/=shift(@_);
my @ret=();
push(@ret,$line) while(my $line=<$fh>);
return(@ret);
}

Mit den Filehandle in einer Variablen kann man einfach mehr anstellen.\n\n

<!--EDIT|topeg|1159930864-->
Froschpopo
 2006-10-04 10:11
#70453 #70453
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
ist das ne Referenz? und dass man ne subroutine mit sub my_read($$) aufurfen kann hab ich auch noch nicht gesehn...

was macht denn "$$" ?
sid burn
 2006-10-04 11:54
#70454 #70454
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Der normale Name "HANDLE" ist ein Typeglob, und der gilt Global für das Package.

Wenn du allerdings ein Skalar benutzt, dann gilt dieser, sofern du ihn mit my deklarierst, nur für den aktuellen Block/Datei.

Wenn du z.B. eine Datei öffnest und das Dateihandle dann "FH" nennst, dann ein oder zwei Zeilen ausliest und dann sagen wir mal eine eigene Subroutine aufrufst die auch wieder "FH" als Dateihandle benutzt.

Dann würde das open() in der Subroutine dein altes FH schließen, und diese wieder neu öffnen. Deswegen würden damit auch keine Rekursiven Funktionen gehen, da du mit jedem aufruf dein Dateihandle wieder schließt.

Wenn du aber stattdessen eine lexikalische Variable benutzt, dann gilt jede Variable nur für Ihren Block.

Letztendlich ist es weniger Fehleranfällig, und es erhöht auch deine Möglichkeiten.

(Obwohl man das ganze auch mit "local *FH" lösen könnte, ich meine da gab es aber trotzdem noch ein Unterschied. *nachdenk*)

Quote
ist das ne Referenz? und dass man ne subroutine mit sub my_read($$;) aufurfen kann hab ich auch noch nicht gesehn...

Die Subroutine wird nicht so aufgerufen, sie wird so definiert.
Das ist ein Prototyp. Daher diese Subroutine benötigt mindestens 2 Werte.

perlsub\n\n

<!--EDIT|sid burn|1159948569-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
murphy
 2006-10-04 15:10
#70455 #70455
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
[quote=sid burn,04.10.2006, 08:54][...] (Obwohl man das ganze auch mit "local *FH" lösen könnte, ich meine da gab es aber trotzdem noch ein Unterschied. *nachdenk*) [...][/quote]
Ich glaube, das Problem mit lokalisierten Dateihandles ist eigentlich nur, dass man nicht spezifisch den Dateihandleteil des Typeglobs lokalisieren kann, sondern den ganzen Typeglob lokalisieren muss. Das kann nun wiederum zu merkwürdigen Seiteneffekten führen, falls jemand auf die Idee gekommen ist, unter dem gleichen Namen wie das Dateihandle zum Beispiel noch einen Hash anzulegen...

(edit: typo)\n\n

<!--EDIT|murphy|1159960552-->
When C++ is your hammer, every problem looks like your thumb.
pq
 2006-10-04 17:53
#70456 #70456
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
steht hier schon erklärt: Wiki:Lexikalischer Filehandle
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-10-04 17:57
#70457 #70457
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=topeg,04.10.2006, 05:00]es gilt:
Code: (dl )
$fh=*HANDLE

damit kannst du sowas machen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
my @dada=my_read($fh,",");
# oder
my @dada=my_read(*HANDLE);
sub my_read($$)
{
 my $fh=shift(@_);
 local $/=shift(@_);
 my @ret=();
 push(@ret,$line)  while(my $line=<$fh>);
 return(@ret);
}

Mit den Filehandle in einer Variablen kann man einfach mehr anstellen.[/quote]
was soll denn der prototyp bei my_read?
prototypen werden IMHO zu oft benutzt, und in diesem fall auch noch
falsch.
in meinen skripten ist immer warnings angeschaltet. hättest du das auch
gemacht, hätte perl dich auch gewarnt.
wenn du eine subroutine aufrufst, bevor sie deklariert wurde, kann
der prototyp nicht gecheckt werden.
hättest du den aufruf erst danach gemacht, hätte dich perl wiederum
darauf aufmerksam gemacht, dass du die subroutine per prototyp
mit 2 skalaren aufrufen willst, aber du rufst sie nur mit einem argument auf.
also gleich 2 fehler.\n\n

<!--EDIT|pq|1159970269-->
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-10-04 17:59
#70458 #70458
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=topeg,04.10.2006, 05:00]
Code: (dl )
1
2
  my @ret=();
 push(@ret,$line)  while(my $line=<$fh>);
[/quote]
ein
Code: (dl )
my @ret = <$fh>;
reicht dir 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
<< >> 8 Einträge, 1 Seite



View all threads created 2006-10-04 05:24.