hat wer einen guten Link (oder kann es in Worte fassen), wann was 0 ist,
existiert, definiert ist, und das im Zusammenhang mit Referenzen? Wann kann
ich wie die Referenz pr�fen, wann muss ich erst dereferenzieren?
Danke und Gru�, Helmut
--
No Swen today, my love has gone away
My mailbox stands for lorn, a symbol of the dawn
Spontan fallen mir ein:
perldoc perlreftut
perldoc perlref
Was ist genau deine Frage? Zum Beispiel was genau meinst du mit "wann
was 0 ist"? Meinst du damit, ob ==0 wahr ist? Aber ich sehe da gerade
keinen Zusammenhang zu Referenzen. Was f�r Referenzen meinst du
�berhaupt? Harte oder symbolische?
Zu "Referenz pr�fen": Worauf?
print "ist ne ref" if ref($x)�
vielleicht also auch noch
perldoc -f ref
Wolf
Kann es sein, dass du Perl Referenzen mit C Pointern in einen Topf wirfst?
Gr��e
Frank Seitz
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen f�r Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Wo finde ich Literatur zu if-Zust�nden von Referenzen auf Hashes, Arrays
und Skalaren? :)
Was wird in den drei dir genannten perldocs nicht beantwortet?
Mit "if-Zustand von Referenzen" tue ich mich auch schwer. Ich wei� nicht
genau, was du meinst!
- Wolf
>
> Wo finde ich Literatur zu if-Zust�nden von Referenzen auf Hashes, Arrays
> und Skalaren? :)
perldoc perlsyn:
The number 0, the strings '0' and '', the empty list (), and undef are all false
in a boolean context. All other values are true.
Referenzen (egal worauf sie verweisen) geh�ren nicht zu den hier genannten, sind
also immer wahr
chris@LAMPRECHT:~$ perl -e'print "true\n" if 0'
chris@LAMPRECHT:~$ perl -e'print "true\n" if \0'
true
Wenn du das testen willst, worauf die Referenz verweist, musst du also immer
dereferenzieren:
chris@LAMPRECHT:~$ perl -e'print "true\n" if ([])'
true
chris@LAMPRECHT:~$ perl -e'print "true\n" if (@{[]})'
Gr��e, Christoph
--
Tk::EntrySet
display/edit a list of values in a Set of Widgets.
Tk::ChoicesSet
display/edit a list of choices in a Set of single-selection Widgets.
Sehe ich genauso.
> Wenn du das testen willst, worauf die Referenz verweist, musst du also immer
> dereferenzieren:
>
> chris@LAMPRECHT:~$ perl -e'print "true\n" if ([])'
> true
> chris@LAMPRECHT:~$ perl -e'print "true\n" if (@{[]})'
Du testest hier, ob die referenzierte Datenstruktur
(hier ein Array) Elemente enth�lt. Zu testen, worauf eine
Referenz verweist, ist etwas anderes. Das macht man eher mit
ref, reftype oder isa, ohne zu dereferenzieren.
Gr��e
Frank
>> Wenn du das testen willst, worauf die Referenz verweist, musst du also immer
>> dereferenzieren:
>>
>> chris@LAMPRECHT:~$ perl -e'print "true\n" if ([])'
>> true
>> chris@LAMPRECHT:~$ perl -e'print "true\n" if (@{[]})'
>
> Du testest hier, ob die referenzierte Datenstruktur
> (hier ein Array) Elemente enth�lt.
eben: *das* , worauf die Referenz verweist (Ist ein Relativsatz) - schlecht
formuliert - aber vielleicht trotzdem im Kontext der Frage verst�ndlich.
Es geht darum zu testen, ob der 4. Fall der obigen Definition vorliegt.
Gruss, Christoph
So habe ich Perl Referenzen verstanden, ja. Nicht gut?
Es gibt Unterschiede. Anders als ein Pointer in C ist eine Referenz in Perl
immer mit einem Objekt verkn�pft. Folglich gibt es keine
Entsprechung zum Nullpointer.
Gr��e
Frank
...und wenn ich das Objekt per 'delete' l�sche, bleibt die Referenz
definiert und verweist auf ein leeres Objekt?!
Tip: Kauf dir ein Perl-Buch.
Wenn du es gelesen hast, k�nnen wir uns weiter unterhalten.
Gr��e
Frank Seitz
> Frank Seitz schrieb:
>> Lamprecht wrote:
>>> perldoc perlsyn:
>>>
>>> The number 0, the strings '0' and '', the empty list (), and undef are all false
>>> in a boolean context. All other values are true.
>>>
>>> Wenn du das testen willst, worauf die Referenz verweist, musst du also immer
>>> dereferenzieren:
>>>
>>> chris@LAMPRECHT:~$ perl -e'print "true\n" if ([])'
>>> true
>>> chris@LAMPRECHT:~$ perl -e'print "true\n" if (@{[]})'
>>
>> Du testest hier, ob die referenzierte Datenstruktur
>> (hier ein Array) Elemente enthᅵlt.
>
> eben: *das* , worauf die Referenz verweist (Ist ein Relativsatz) - schlecht
> formuliert - aber vielleicht trotzdem im Kontext der Frage verstᅵndlich.
> Es geht darum zu testen, ob der 4. Fall der obigen Definition vorliegt.
perldoc -f ref
ref EXPR
ref Returns a non-empty string if EXPR is a reference, the empty
string otherwise.
Wenn eine Referenz ᅵbergeben wird, liefert ref in einem booleschen Kontext
true, sonst false.
cu,
Martin
--
One OS to rule them all | Martin Vorlaender | OpenVMS rules!
One OS to find them | work: m...@pdv-systeme.de
One OS to bring them all | http://vms.pdv-systeme.de/users/martinv/
And in the Darkness bind them.| home: martin.v...@t-online.de
Es ging darum, dass man ein leeres Arrayref dereferenzieren muss, damit es (als
leere Liste) im boolschen Kontext als false ausgewertet wird.
Grᅵᅵe, Christoph
Hallo,
also ich mache das folgendermassen:
--- snip ------ snip ------ snip ------ snip ------ snip ------ snip ------
snip ------ snip ------ snip ---
my $myArrayRef = []; #
Referenz auf leere liste (Array ohne Eintr�ge)
my $isFilledArray = scalar @$myArrayRef; # liefert die
Anzahl der Elemente im Array zur�ck
if ($isFilledArray)
{
# We have got elements in the array
...
}
...
--- snap ------ snap ------ snap ------ snap ------ snap ------ snap ------
snap ------ snap ---
Bis denn...
PiT
Total umst�ndlicher Code :)
Folgender tut dasselbe:
my $myArrayRef = [];
# ...
if (@$myArrayRef) {
# ...
}
Gr��e
Frank Seitz
Stimmt, aber es ging ja auch nicht um "K�rze" sondern um "Anschaulichkeit"
;-)
Bis denn...
PiT
> ...und wenn ich das Objekt per 'delete' l�sche, bleibt die Referenz
> definiert und verweist auf ein leeres Objekt?!
Wie willst du mit "delete" ein Objekt l�schen?
Wenn du tats�chlich etwas "l�scht", worauf eine Referenz zeigt, dann bleibt
das "Etwas" erhalten. Kleines Beispiel:
my $a;
{
my $b = 4;
$a = \$b;
}
print $$a; # <-- Gibt 4 aus
Da die Variable $b im inneren Scope definiert wurde, verschwindet sie,
sobald der Scope verlassen wird. Da aber vorher auf ihren _Wert_ eine
Referenz gelegt wurde, bleibt dieser erhalten und kann auch au�erhalb des
Scopes (durch Dereferenzieren) angesprochen werden. Die Referenz zeigt also
nach dem Verlassen des Scopes nicht etwa in den Wald! Anders gesagt: wenn du
etwas zu l�schen versuchst, worauf noch etwas anderes zeigt, dann findet das
L�schen ganz einfach nicht statt. Und dank sog. Referenzz�hler "wei�" Perl
zu jeder Zeit, ob auf Werte (oder Objekte) noch "etwas anderes" zeigt.
Nullpointer, die Exceptions verursachen, gibt es in Perl Gott sei Dank
nicht!
LG, Ferry
--
Ing. Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: ferdinand.bolh...@wien.gv.at
> Anders
> gesagt: wenn du etwas zu löschen versuchst, worauf noch etwas anderes
> zeigt, dann findet das Löschen ganz einfach nicht statt. Und dank sog.
> Referenzzähler "weiß" Perl zu jeder Zeit, ob auf Werte (oder Objekte)
> noch "etwas anderes" zeigt.
Angenommen $a ist eine Referenz auf irgendwas sehr großes, von
dem ich eigentlich dachte, es gelöscht zu haben. Weil ich aber ein
schlechter Programmierer bin, habe ich vergessen, dass $a noch darauf
zeigt und entsprechend frisst mein Programm unnötig Speicher. Kann ich
das irgendwie aufdecken?
Oliver
Grundsätzlich nur durch Analyse, denn ein Programm kann nicht entscheiden,
ob eine Referenz noch gebraucht wird oder nicht.
Es gibt Module, die dich dabei unterstützen können, z.B. Devel::Leak::Object.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Homepage: http://www.fseitz.de/
XING-Profil: http://www.xing.com/profile/Frank_Seitz2
Umgekehrt, siehe unten.
> Wie willst du mit "delete" ein Objekt l�schen?
>
> Wenn du tats�chlich etwas "l�scht", worauf eine Referenz zeigt, dann bleibt
> das "Etwas" erhalten. Kleines Beispiel:
>
> my $a;
> {
> my $b = 4;
> $a = \$b;
> }
> print $$a; # <-- Gibt 4 aus
Das ist ein schlechtes Beispiel, denn da kommt gar kein delete vor.
Nehmen wir ein Beispiel mit delete:
my %h = (
a => 1,
b => 2,
c => 3,
);
my $r = \$h{b};
delete $h{a};
delete $h{b};
Aus perldoc -f delete:
| delete EXPR
| Given an expression that specifies a hash element, array
| element, hash slice, or array slice, deletes the specified
| element(s) from the hash or array.
Man beachte: "deletes ... *from the hash or array*". D.h., das Element
wird aus dem Hash oder Array entfernt (und danach eventuell
garbage-collected). Es wird nicht das Element
"gel�scht" und dann bleibt ein Verweis auf das leere Element im Hash
oder Array �brig.
Im Beispiel oben:
delete $h{a} entfernt das Element (a => 1) aus dem Hash. Das Objekt "1"
wird damit nirgends mehr referenziert und wird freigegeben.
delete $h{b} entfernt das Element (b => 2) aus dem Hash. Es gibt aber
noch eine weitere Referenz auf das Objekt "2" (in $r), daher bleibt das
Objekt "2" bestehen.
Das Objekt "3" bleibt ohnehin bestehen, solange %h besteht,
> Da die Variable $b im inneren Scope definiert wurde, verschwindet sie,
> sobald der Scope verlassen wird. Da aber vorher auf ihren _Wert_ eine
> Referenz gelegt wurde,
Man kann keine Referenz auf einen _Wert_ legen, nur auf ein Objekt (im
C-Sinn, nicht im Sinn objekt-orientierte Programmierung). Der Wert steht
dann im Objekt drin und kann ge�ndert werden, die Referenz �ndert sich
dadurch nicht.
> Nullpointer, die Exceptions verursachen, gibt es in Perl Gott sei Dank
> nicht!
my $obj = undef;
$obj->method();
Gut, da kann Perl nicht anders, weil es keine Ahnung hat, welchen Typ
$obj haben sollte, wenn es nicht gerade undef w�re.
Aber man kann perl dazu bringen, bei Verwendung von Nullpointern, �h,
undef auch in anderem Kontext eine Exception zu werfen:
#!/usr/bin/perl
use warnings;
use strict;
my @data = ('foo', 'bar', undef, 'gazonk');
{
use warnings FATAL => 'uninitialized';
print join(",", @data), "\n";
}
__END__
hp