Thread aus hashreferenz -> hashnamen ermitteln (20 answers)
Opened by worst_case at 2019-01-27 16:55

memowe
 2019-02-04 17:01
#189723 #189723
User since
2008-08-07
13 Artikel
BenutzerIn
[Homepage]
user image
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

Code: (dl )
1
2
answer => 42
answer => 17


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:

Code: (dl )
1
2
AAAAARGH!
answer => 42

Last edited: 2019-02-04 17:02:41 +0100 (CET)

View full thread aus hashreferenz -> hashnamen ermitteln