Thread Schreibweise für GLOB (4 answers)
Opened by rosti at 2018-11-24 12:55

haj
 2018-11-25 21:03
#189303 #189303
User since
2015-01-07
521 Artikel
BenutzerIn

user image
2018-11-25T07:11:29 rosti
Interesant, danke Dir

dump zeigt jedoch nicht alles:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Eigenschaften via Glob anhängen
*m->{FOO} = 'foo'; # einfach Glob
print dump $m;


do {
  require Symbol;
  my $a = bless(Symbol::gensym(), "main");
  *{$a} = {
    io_sock_nonblocking => 0,
    io_socket_domain    => 2,
    io_socket_proto     => 6,
    io_socket_timeout   => 1,
    io_socket_type      => 1,
  };
  $a;
}


Also gibt es ja doch Unterschiede?

Ich hab's ja schon geschrieben: *m->{FOO} = 'foo'; hat mit der lexikalischen Variable $m gar nichts zu tun! Mit *m erzeugst Du einen Eintrag in der Symboltabelle von main. Guckst Du hier:
Code (perl): (dl )
1
2
3
4
5
6
use strict;
use Data::Dump qw/dump/;

*m->{FOO} = 'foo'; # einfach Glob
dump %main::m;
dump $::{m};

Ausgabe:
Code: (dl )
1
2
3
4
5
6
("FOO", "foo")
do {
my $a = *main::m;
$a = { FOO => "foo" };
$a;
}

Die Dinger lassen sich wie Klassenvariablen verwenden, weil sie in der Symboltabelle des jeweiligen package drinstehen. Der Lesbarkeit dient das allerdings nicht. Du verbuchselst das auch mit my $self (lexikalischer Skalar, nicht in der Symboltabelle) und *self (Typeglob, spricht für alle Einträge mit dem Namen "self" in der Symboltabelle).

Das hatte mich auch bei Deinem ursprünglichen Artikel so stutzig gemacht: Das übliche Mantra ist my $self = shift; und somit einfach eine andere Baustelle als *self!

View full thread Schreibweise für GLOB