Schrift
[thread]8346[/thread]

exists



<< |< 1 2 >| >> 15 Einträge, 2 Seiten
Froschpopo
 2006-09-19 19:50
#70061 #70061
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Was ich mir noch von perl wünschen würde, wäre z.b. sowas:

Code: (dl )
1
2
3
4
5
6
7
my %hash = (
'key' => [\%foobar, 1]
);

my $hashref = \$hash{key};

print 1 if exists $hashref;


eigentlich schade, dass sowas nicht funzt.\n\n

<!--EDIT|Froschpopo|1158681153-->
renee
 2006-09-19 20:06
#70062 #70062
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Was willst Du damit überprüfen?

Meinst Du vielleicht ein
Code: (dl )
print "yes" if defined $hashref
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
esskar
 2006-09-19 20:13
#70063 #70063
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=renee,19.09.2006, 18:06]Was willst Du damit überprüfen?

Meinst Du vielleicht ein
Code: (dl )
print "yes" if defined $hashref
[/quote]
wird immer yes, da referenzen immer true sind!
esskar
 2006-09-19 20:15
#70064 #70064
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=Froschpopo,19.09.2006, 17:50]
Code: (dl )
1
2
3
4
my %hash = (
         'key'     =>     [\%foobar, 1]
);
my $hashref = \$hash{key};
[/quote]
was willst du mit einer referenz auf eine array referenz?

du willst wohl das:
Code: (dl )
my $hashref = exists $hash{key} : $hash{key} : undef;
Froschpopo
 2006-09-19 20:32
#70065 #70065
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Erstmal: Danke!

Ich habe ein gemischtes Hash:
Code: (dl )
1
2
3
4
my %hash = (
'key1' => [\%foobar, 1],
'key2' => %foo
);

Nun will ich eine Fallunterscheidung konstruieren:
Code: (dl )
1
2
3
4
5
6
7
my $hashref = \$hash{key2};

if (defined $hashref->[1]) {
$hashref->[0]->(\@args); # führt Subref aus, wenn Index 1 gleich wahr ist.
} else {
$hashref->(@args);
}

im obigen Beispiel müsste also der ELSE-Block ausgeführt werden, da es im Wert von key2 keine Arrayref mit einem Index 1 gibt.\n\n

<!--EDIT|Froschpopo|1158683604-->
Dubu
 2006-09-20 02:13
#70066 #70066
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
@esskar: Der erste ":" soll wahrscheinlich ein "?" sein.

@frosch: Mit der Funktion ref() kannst du herausfinden, worauf eine Referenz zeigt. Sie liefert dann "ARRAY", "HASH", "SCALAR" oder auch "REF" zurück.

Aber "'key2' => %foo" geht nicht, der Wert muss ein Skalar oder eine Referenz sein.
Froschpopo
 2006-09-20 02:54
#70067 #70067
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
[quote=esskar,19.09.2006, 18:15][quote=Froschpopo,19.09.2006, 17:50]
Code: (dl )
1
2
3
4
my %hash = (
'key' => [\%foobar, 1]
);
my $hashref = \$hash{key};
[/quote]
was willst du mit einer referenz auf eine array referenz?

du willst wohl das:
Code: (dl )
my $hashref = exists $hash{key} : $hash{key} : undef;
[/quote]
nein, ich brauch die Referenz. Auch für andere Dinge noch.

Aber scheinbar ist es technisch schlichtweg nicht möglich, einen Hash mit Schlüsselparameter zu referenzieren.

Code: (dl )
perl -e '%hash = (foo => ["bar", "foobar"]); $hashref = \$hash{foo};'

wie komme ich jetzt an "foobar" ran?

Theoretisch müsste ich doch jetzt einfach mit $hashref->[1] an foobar rankommen, oder?
Stattdessen bekomm ich aber nen

"not an ARRAY reference at -e line 1"

aus logischer Sicht müsste das aber doch korrekt sein. Scheinbar ist das mit Perl nur nicht möglich.\n\n

<!--EDIT|Froschpopo|1158706766-->
esskar
 2006-09-20 04:22
#70068 #70068
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code: (dl )
$$hashref->[1]
pq
 2006-09-20 12:37
#70069 #70069
User since
2003-08-04
12207 Artikel
Admin1
[Homepage]
user image
[quote=Froschpopo,19.09.2006, 18:32]Erstmal: Danke!

Ich habe ein gemischtes Hash:
Code: (dl )
1
2
3
4
my %hash = (
          'key1'       =>     [\%foobar, 1],
          'key2'       =>     %foo
);

Nun will ich eine Fallunterscheidung konstruieren:[/quote]
also du scheinst mir da noch ein verständnisproblem zu haben.
zuerst einmal versuchst du dem hashkey 'key2' %foo zuzuweisen, aber
stattdessen musst du die referenz zuweisen.
lies doch mal perldata, perllol, perldsc und perlreftut. du weißt ja, wo
sich die dokus in unserem wiki befinden.
dann sagst du
my $hashref = \$hash{key2};
was soll das für einen sinn haben, eine ref auf eine hashref zu bilden
(wenn wir mal annehmen, du hättest obige zuweisung richtig gemacht)?
wieso nicht einfach
my $hashref = $hash{key2};
sonst hast du eine ref auf eine hashref. sowas ist unnötig (in den meisten fällen).

dann wiederum sagst du
if (defined $hashref->[1]) {
du hash eine *hashref* und möchtest das element mit dem index 1??
denk da nochmal drüber nach. ich glaube, du kennst den unterschied
zwischen hashes und arrays, vielleicht warst du einfach zu müde?
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
Taulmarill
 2006-09-20 13:05
#70070 #70070
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Quote
Code: (dl )
perl -e '%hash = (foo => ["bar", "foobar"]); $hashref = \$hash{foo};'


du machst hier eine referenz auf eine referenz. was du willst ist warscheinlich
Code: (dl )
1
2
3
%hash = (foo => ["bar", "foobar"]);
$arrayref = $hash{foo};
print $arrayref->[1] . "\n";


wenn du's dir gerne umständlich machen willst, kannst du natürlich auch esskars ansatz verfolgen ;)
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2006-09-19 19:50.