Thread aus hashreferenz -> hashnamen ermitteln
(20 answers)
Opened by worst_case at 2019-01-27 16:55
Hier ein schnell zusammengehacktes Beispiel, warum diese Zweckentfremdung von bless zu ganz seltsam unerwartetem Verhalten führen kann, durch eben genannte Namensraumkollisionen:
Code (perl): (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 #!/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; Die Ausgabe ist, wie man sofort sieht, NICHT Vielmehr stirbt das Programm mit dem folgenden Ergebnis, auf das man niemals kommen würde, wenn man nicht die Zeilen 20-24 genau gelesen hätte, die allerdings irgendwo ganz woanders versteckt stehen könnten, vielleicht sogar ohne böse Absicht: Last edited: 2019-02-04 17:02:41 +0100 (CET) |