1 2 3 4 5 6 7 8
my %haha = (__name => 'Mein Name ist Hash'); test(\%haha); sub test { my ($ref) = @_; # Die Klammern sind notwendig! print $ref->{__name}; # Mein Name ist Hash }
2019-01-27T15:55:58 worst_caseJetzt möchte ich zu Testzwecken in der Funktion, die ja nur die referenz kennt, den Namen des hash ausgeben.
my ($package, $filename, $line) = caller;
1 2 3 4 5 6 7 8 9 10 11 12 13 14
# ... sub funktion { my ( $hashname, $hRef, ) = @_; if ( $debug ) { # xdump() to be defined or replaced with imported dumper... warn "$hashname lieferte ", xdump( $hRef ), "\n"; } } # ... funktion( "hashname" => \%hash );
inoremap <leader>DD <ESC>^iwarn __PACKAGE__.':'.__LINE__.$".Data::Dumper->Dump([\<ESC>llyw$a], ['<ESC>pa']);<ESC>
%hash\DD
warn __PACKAGE__.':'.__LINE__.$".Data::Dumper->Dump([\%hash], ['hash']);
1 2 3 4 5 6 7 8 9 10
my $foo = bless{}, 'foo'; my $bar = bless{}, 'bar'; toggle($foo); toggle($bar); sub toggle{ my $r = shift; print ref $r; }
2019-01-29T19:00:12 rostiFertig ;)
2019-02-04T15:21:25 rostiMit Vorsicht? Wenn man nicht weiß was eine Funktion macht, sollte man sie überhaupt nicht verwenden!
QuoteMan kann sich aber auch schlau machen und selbst informieren. Z.B. darüber, dass es OOP in Perl nicht erst seit Moose gibt!
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
#!/usr/bin/env perl use strict; use warnings; # Pretty-printer for hashes (depth 1) sub print_hash { my $hash = shift; print join ', ' => map "$_: $hash->{$_}" => sort keys %$hash; } # Add a given name as meta data to the given hash sub add_name_to_hash { my ($hash, $name) = @_; return bless $hash => $name; } # WARNING: injects an overloading into CGI package CGI; use overload '%{}' => sub {die "AAAAARGH!\n"}; package main; # End of insanity # Prepare some data my $data1 = {answer => 42}; my $data2 = {answer => 17}; # Add names $data1 = add_name_to_hash($data1, 'HTTP'); $data2 = add_name_to_hash($data2, 'CGI'); # Print it print_hash $data1; print_hash $data2;
1 2 3 4 5 6 7 8 9 10 11 12 13 14
package HTTP; use overload '%{}' => sub {die "AAAAARGH!\n"}; package main; use base 'HTTP'; sub print_hash { my $self = shift; keys %$self; } my $m = bless{},'main'; # Eine Instanz meiner Klasse $m->print_hash();
2019-02-04T16:11:03 rostiDas hat aber nichts mit bless zu tun sondern mit overload.
2019-02-04T16:58:27 rostiQuoteDie bless-Verwendung macht doch hier erst möglich, dass ein beliebiger String als Package-Name verwendet wird,
Ja schon. Aber das Kollosionsproblem fängt ja schon bei der Namensgebung einer Package an.
Quote"auf eigene Gefahr" zu kennzeichnen?