Question to scalars used as filehandles
Question to scalars used as filehandles
am 09.10.2006 16:03:54 von Ferry Bolhar
Hello,
when doing an
open $fh,'x.x';
with an otherwise unused scalar, the scalar is converted
to a reference to a glob, so I can do this:
print ref $fh; # prints "GLOB"
If, however, the scalar was used elsewhere already,
$fh = 'Hello';
......
open $fh,'x.x';
the "open" still works, but the scalar isn't converted to a
reference, it still contains the string 'Hello'.
So the question is: Why the difference? And from an XS
programmer's point of view: in the second example, where
in the scalar the pointer to the underlying filehandle is stored?
Thanks for your replies,
Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
Re: Question to scalars used as filehandles
am 09.10.2006 16:25:27 von Frank Seitz
Ferry Bolhar wrote:
> when doing an
>
> open $fh,'x.x';
>
> with an otherwise unused scalar, the scalar is converted
> to a reference to a glob, so I can do this:
>
> print ref $fh; # prints "GLOB"
>
> If, however, the scalar was used elsewhere already,
>
> $fh = 'Hello';
> .....
> open $fh,'x.x';
>
> the "open" still works, but the scalar isn't converted to a
> reference, it still contains the string 'Hello'.
>
> So the question is: Why the difference?
Im zweiten Fall ist $fh eine Symbolic Reference,
also der Name eines Filehandle. Ist im Grunde dasselbe,
wie bei Symbolic References auf Arrays, Hashes, ...
Sollte man im Normalfall also meiden.
> And from an XS
> programmer's point of view: in the second example, where
> in the scalar the pointer to the underlying filehandle is stored?
Die Perl-Filehandle, um die es geht, ist Hello. Hilft das?
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Question to scalars used as filehandles
am 10.10.2006 10:10:08 von Ferry Bolhar
Frank Seitz:
> Im zweiten Fall ist $fh eine Symbolic Reference,
> also der Name eines Filehandle. Ist im Grunde dasselbe,
> wie bei Symbolic References auf Arrays, Hashes, ...
> Sollte man im Normalfall also meiden.
Zuächst bitte um Entschuldigung, dass ich auf englisch gepostet
habe, der Beitrag war - wie unschwer zu erraten - eigentlich
für c.l.p.m bestimmt.
Ansonsten vielen Dank für deinen Hinweis! Jetzt ist mir der
Unterschied klar, und auch, warum in beiden Fällen derselbe
Code generiert wird - die Unterscheidung findet erst zur
Laufzeit statt.
"Meiden" kann ich es übrigens leider nicht, denn mein Skript
muss auch unter 5.005 laufen, wo es - außer Barewords, und
die sind ja noch weniger wünschenswert als symbolsche
Referenzen, die man wenigstens auch in Lexikals unterbringen
kann - leider keine Alternative gibt. Das in der Doku erwähnte
"Auto-Vivifying" - das "Erwecken" eines undefinierten Skalars
zu einer Referenz auf einen Filehandle - gibt es ja erst seit 5.6.
LG, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
Re: Question to scalars used as filehandles
am 10.10.2006 10:48:15 von hjp-usenet2
On 2006-10-10 08:10, Ferry Bolhar wrote:
> Frank Seitz:
>> Im zweiten Fall ist $fh eine Symbolic Reference,
>> also der Name eines Filehandle. Ist im Grunde dasselbe,
>> wie bei Symbolic References auf Arrays, Hashes, ...
>> Sollte man im Normalfall also meiden.
[...]
> "Meiden" kann ich es übrigens leider nicht, denn mein Skript
> muss auch unter 5.005 laufen, wo es - auÃer Barewords, und
> die sind ja noch weniger wünschenswert als symbolsche
> Referenzen, die man wenigstens auch in Lexikals unterbringen
> kann - leider keine Alternative gibt.
In dem Fall würde ich definitiv Barewords bevorzugen. Da weià man
wenigstens, wie die sich verhalten. Dass
#!/usr/bin/perl
{
my $fh2 = "hallo";
open $fh2, $0;
my $x = <$fh2>;
print $x;
}
my $y = ;
print $y;
die ersten zwei Zeilen von sich selbst ausgibt, weil "hallo" eben nicht
automatisch geschlossen wird, wenn $fh2 den Scope verlässt, halte ich
zumindest für fehleranfällig (ich kann nicht sagen, dass es
"überraschend" sei, denn nach Franks Erklärung hatte ich das erwartet),
aber wenn ich irgendwo in Perl-Code lexikalische Filehandles sehe,
erwarte ich eigentlich schon, dass sich die wie solche verhalten.
AuÃerdem funktioniert das nicht mit use strict.
hp
--
_ | Peter J. Holzer | > Wieso sollte man etwas erfinden was nicht
|_|_) | Sysadmin WSR | > ist?
| | | hjp@hjp.at | Was sonst wäre der Sinn des Erfindens?
__/ | http://www.hjp.at/ | -- P. Einstein u. V. Gringmuth in desd
Re: Question to scalars used as filehandles
am 10.10.2006 14:45:11 von Ferry Bolhar
Peter J. Holzer:
> aber wenn ich irgendwo in Perl-Code lexikalische Filehandles sehe,
> erwarte ich eigentlich schon, dass sich die wie solche verhalten.
Ja, aber die sehen nur aus wie lexikalische Filehandles, sind es aber
eben nicht.
> Außerdem funktioniert das nicht mit use strict.
bzw. mit "use strict 'refs'" um genau zu sein. Natürlich nicht,
symbolische Referenzen sind da ja grundsätzlich nicht erlaubt.
Das ließe sich natürlich durch Verwenden der symbolischen
Referenz in einem eigenen Block, den ein "no strict 'refs'"
vorangestellt wird, beheben.
Aber so wie du es beschreibst, dürften Barewords hier tatsächlich
das kleinere Übel sein.
Nochmals danke für die Info, und schöne Grüße
LG, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at