Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]9133[/thread]

Erkennen, welchen Inhalt eine Variable beinhaltet: Ob String, Array, Hash,...

Leser: 1


<< >> 7 Einträge, 1 Seite
Mates
 2007-06-28 16:35
#77968 #77968
User since
2006-08-15
21 Artikel
BenutzerIn
[default_avatar]
Salü!
Wie kann ich eine Abfrage machen, ob z.B. $Data ein Hash is ( $Data{Hash} ) oder ein Array ( $Data[1] ) oder einfach ein String ( $Data = 2; )??\n\n

<!--EDIT|Mates|1183034272-->
esskar
 2007-06-28 16:47
#77969 #77969
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
print ref $Data;
PerlProfi
 2007-06-28 17:09
#77970 #77970
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Schau dir mal CPAN:Scalar::Util an.
Da findest du die Funktionen reftype() und blessed() zusammen mit ref() kannst du damit alles Mögliche prüfen.

Beispiel:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
my $ref = ref($data);
my $reftype = reftype($data);
my $blessed = blessed($data);

if ( $ref ) {
# $data ist eine Referenz
if ( $blessed ) {
# $data ist ein Objekt
if ( uc($blessed) eq 'REGEXP' ) {
# $data ist eine Referenz auf einen regulären
# Ausdruck, z.B. mit qr// erstellt
}
}
else {
# $data ist kein Objekt
if ( $reftype eq 'REF' ) {
# $data ist eine Referenz auf eine Referenz
}
elsif ( $reftype eq 'SCALAR' ) {
# $data ist eine Referenz auf ein Scalar
}
elsif ( $reftype eq 'ARRAY' ) {
# $data ist eine Referenz auf ein Array
}
elsif ( $reftype eq 'HASH' ) {
# $data ist eine Referenz auf ein Hash
}
elsif ( $reftype eq 'CODE' ) {
# $data ist eine Codereferenz
}
elsif ( $reftype eq 'GLOB' ) {
# $data ist eine Globreferenz
}
}
}
else {
# $data ist keine Referenz
}

Das geht auch nur mit ref(), aber ich finde es so schöner, der Vorteil ist vor allem, dass du mit reftype() wirklich den Type bekommst und nicht wie bei ref(), wenn es ein Objekt ist, die Klasse des Objektes.
Und mit blessed() bekommst du eben die Klasse und nicht den Type.
blessed() liefert undef, falls es kein Objekt bekommt.
reftype() liefert undef, falls es keine Referenz bekommt.

MfG
Sucher
 2007-06-28 19:18
#77971 #77971
User since
2007-03-26
47 Artikel
BenutzerIn
[default_avatar]
[quote=Mates,28.06.2007, 14:35]Salü!
Wie kann ich eine Abfrage machen, ob z.B. $Data ein Hash is ( $Data{Hash} ) oder ein Array ( $Data[1] ) oder einfach ein String ( $Data = 2; )??[/quote]
Hallo,

wenn du $Data{Hash} schreibst ist %Data der Hash, den du ansprichst. Wenn es diesen Hash %Data nicht gibt, bekommst du unter use strict die Meldung:

Quote
Global symbol "%Data" requires explicit package name at ...

Da ist also eigentlich nichts zu testen.
Analog verhält es sich mit dem Array...

Grüße,\n\n

<!--EDIT|Sucher|1183044047-->
bloonix
 2007-06-28 19:27
#77972 #77972
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=Sucher,28.06.2007, 17:18]Da ist also eigentlich nichts zu testen.[/quote]
Es gibt unzählige Schnittstellen, an denen man testen möchte, was
übergeben wurde!

Code: (dl )
1
2
3
my $obj = Any::Module->new({ param => 'value' });
# oder
my $obj = Any::Module->new([ qw/file1 file2 file3/ ]);

Wenn du der Maintainer von Any::Module bist, möchtest du bestimmt
wissen, was da übergeben wurde.\n\n

<!--EDIT|opi|1183044483-->
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.
sid burn
 2007-06-28 21:13
#77973 #77973
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
@opi
Ich glaube du hast "Sucher" nicht richtig verstanden. ;)

Der Threadersteller hat gefragt wie man Hashes oder Arrays erkennen kann, und er hat folgende beispiele gegeben

$data[0]
$data{hash}

Und wenn du das siehst, dann brauchst du in dem Sinne nichts testen. Das obere ist ein Array @data allerdiengs nur ein Element davon, und das untere ein Element aus dem hash %data.

Und der TE hat nichts von Referenzen gesagt die einer Funktion übergeben werden...

------------------------

Quote
Wie kann ich eine Abfrage machen, ob z.B. $Data ein Hash is ( $Data{Hash} ) oder ein Array ( $Data[1] ) oder einfach ein String ( $Data = 2; )??

Ansonsten liest sich diese Frage eher so als das das Konzept der Sigils nicht verstanden wurde. Den ein Array oder Hash hat ein anderes Sigil. Ein Array hat @ und ein hash hat %. Allerdiengs nur wenn du es als ganzes ansprichst. Wenn du einen einzelnen Wert ausliest, dann nutzt du immer $.

Die Frage liest sich irgendwie wie ein PHPler, den in PHP hat man ja nur $ als Sigil für jede Variabel, egal ob Array, Hash oder Skalar.


$data[0] ist also ein einzelner Wert, und das Array dazu heißt @data.

$data{foo} ist ein einzelner Wert eines hashes das %data heißt.

$data = 'string' wäre eine ganz andere Variable...\n\n

<!--EDIT|sid burn|1183050859-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
bloonix
 2007-06-28 21:27
#77974 #77974
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=sid burn,28.06.2007, 19:13]Ich glaube du hast "Sucher" nicht richtig verstanden. ;)[/quote]
gut möglich. passiert auch mal ;)

aber vielleicht hat sucher auch den te nicht verstanden, der möchte
nämlich wissen, was

Quote
$data is

*g*\n\n

<!--EDIT|opi|1183051798-->
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.
<< >> 7 Einträge, 1 Seite



View all threads created 2007-06-28 16:35.