Schrift
[thread]11425[/thread]

wie testen ob leeres Array definiert wurde?

Leser: 4


<< |< 1 2 3 4 >| >> 37 Einträge, 4 Seiten
KurtZ
 2008-03-06 23:58
#106761 #106761
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
Hi

eine vielleicht sehr theoretische Frage ...

Code (perl): (dl )
1
2
3
4
my @leer;
@leer=('dummy');
@leer=();
print "Array wurde definiert" if  ( defined @leer )


und jetzt die 2. Zeile aukommentieren, dann wird die Bedingung FALSE...

Laut Doku liefert defined by Arrays die Aussage ob Speicher allokiert wurde und ein leeres Array braucht keinen Speicher.


OK ... aber was nun wenn ich einfach nur wissen will ob das Array je initialisiert wurde egal ob leer oder nicht ???
TMTOWTDYOG (there's more than one way to dig your own grave)
linse
 2008-03-07 00:06
#106763 #106763
User since
2006-02-02
61 Artikel
BenutzerIn
[Homepage]
user image
use strict; ?!
KurtZ
 2008-03-07 00:13
#106765 #106765
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
Das Beispiel ist strict!
TMTOWTDYOG (there's more than one way to dig your own grave)
KurtZ
 2008-03-07 00:22
#106766 #106766
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
zugegeben wenn jede Deklaration eines Arrays gleicbedeutend mit der Initialisierung eines leeren Arrays ist, wird die Frage "tautologisch überflüssig" ... oder nicht ?

Anders gefragt ... sowas wie "undef" gibts nicht für Arrays oder?

ich bin gerade selbst etwas durcheinander ...
TMTOWTDYOG (there's more than one way to dig your own grave)
KurtZ
 2008-03-07 00:41
#106767 #106767
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
AHA!

AFAIS gibts ganz subtile Unterschiede zw. undef @arr und @arr=()

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use strict;
use Data::Dumper;
$\="\n";

my @arr;
@arr=('dummy'); 

@arr=();
if  ( defined @arr ) {
        print "Array wurde definiert \t",Dumper \@arr 
}

undef @arr;
unless  ( defined @arr ) {
        print "Array wurde nicht definiert \t",Dumper \@arr 
}


kommentiert man Zeile 6 aus wird nur noch das unless ausgeführt...

Ergo... wenn ich will das ein leeres Array als definiert gilt muss ich sicherstellen das Speicher allokiert wurde!

Sorry, das hört sich vielleicht sehr theoretisch an, aber ich wette, wegen sowas kann man sich in den Wahnsinn debuggen!

EDIT...NACHTRAG:
defined(@array) is deprecated at /tmp/tst.pl line 11.
(Maybe you should just omit the defined()?)
defined(@array) is deprecated at /tmp/tst.pl line 16.
(Maybe you should just omit the defined()?)


desweiteren:
Use of "defined" on aggregates (hashes and arrays) is deprecated. It used to
report whether memory for that aggregate has ever been allocated. This behavior
may disappear in future versions of Perl


...na super
TMTOWTDYOG (there's more than one way to dig your own grave)
KurtZ
 2008-03-07 16:29
#106807 #106807
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
pq+2008-03-07 14:57:55--
das ist IMHO eine sinnlose abfrage. defined macht nur sinn bei skalaren.


das liest man überall, ich kanns aber nicht nachvollziehen ... es kann IMHO durchaus Sinn machen zu wissen ob ein Array leer oder unbelegt ist.

Beispiel:
Ein Script schicke per Default emails per BCC an bestimmte Empfänger (z.B. sich selber), hat aber zusätzlich ein Array @BCC deklariert. Ist dieses Array belegt (d.h. defined) werden diese Defaults überschrieben, insbesondere erfolgt bei leerem Array gar kein BCC. Die Belegung von @BCC könnte aus Aufrufoptionen stammen.

Natürlich kann ich dieses Verhalten auch umständlicher mit einem Ref $BCC_ref erreichen, aber warum nicht auch gleich orthogonal mit @BCC ???

Oder anders: wenn ich undef @BCC schreiben darf, wieso nicht auch defined @BCC ?

statt defined als deprecated einzustufen wärs IMHO sinnvoller ein leer belegtes Array ohne Umwege als defined einzustufen. Eben analog zu Skalaren wo ein Leerstring auch defined ist. Sonst bricht die Orthogonalität mal wieder.

Oder ???

Falls ich da etwas missverstehe macht mich bitte schlauer! :)
TMTOWTDYOG (there's more than one way to dig your own grave)
pq
 2008-03-07 15:57
#106808 #106808
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
das ist IMHO eine sinnlose abfrage. defined macht nur sinn bei skalaren.
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
GwenDragon
 2008-03-07 16:32
#106809 #106809
User since
2005-01-17
14548 Artikel
Admin1
[Homepage]
user image
Quote
It used to report whether memory for that aggregate has ever been allocated.
Schön, und was nutzt das dann wirklich?

Nachdem autovivid existiert und sowieso Speicher verwendet wird für die Symboltabelle, wenn Arrays existieren, und für das Garbagecollecting, scheint das wohl eher ein Entwicklerfeature oder eine mitgeschleppte Altlast gewesen zu sein.
Nachdem es deprecated (veraltet;missbilligt) ist, sollte eine es nicht anwenden.

Quote
Ist dieses Array belegt (d.h. defined) werden diese Defaults überschrieben

Was hindert dich bitte daran, einfach
if(scalar @Array)
oder if ($#Array>-1) zu schreiben?

Ist für Perlschreibfaule sogar kürzer als defined ;)

Quote
Sonst bricht die Orthogonalität mal wieder.

Ja. Perl hat ein paar Merkwürdigkeiten.
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

KurtZ
 2008-03-07 17:46
#106812 #106812
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
GwenDragon+2008-03-07 15:32:04--
Quote
Ist dieses Array belegt (d.h. defined) werden diese Defaults überschrieben

Was hindert dich bitte daran, einfach
if(scalar @Array)
oder if ($#Array>-1) zu schreiben?


sorry ich verstehe dich nicht. Wie soll ich ein undefiniertes Array so von einem leeren unterscheiden können???
TMTOWTDYOG (there's more than one way to dig your own grave)
Gast Gast
 2008-03-08 06:55
#106826 #106826
Ich verstehe nicht wo der Unterschied zwischen einem "leeren" und einem undefiniertem Array sein soll.

Code: (dl )
my @array; #undefiniertes array

Code: (dl )
1
2
my @array; #undefiniertes array
@array = (); #jetzt ein leeres array


Habe ich das so richtig verstanden? Wenn ja, wozu moechtest du da noch testen koennen ob es undefiniert ist oder keine Elemente enthaelt?
Leer ist doch leer, oder?

MfG
<< |< 1 2 3 4 >| >> 37 Einträge, 4 Seiten



View all threads created 2008-03-06 23:58.