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

haj
 2018-11-24 20:44
#189295 #189295
User since
2015-01-07
527 Artikel
BenutzerIn

user image
2018-11-24T11:55:21 rosti
PS: Solche Schreibweisen finden sich zuhauf in der libnet. So ist es bspw. möglich, *Handles weitere Eigenschaften zuzuweisen

Nun wird mir einiges klar.

Die libnet hat einen Stil, der aus heutiger Sicht ein bisschen eigentümlich ist. Das liegt zum einen daran, dass der Code überwiegend vor langer Zeit entstanden ist und zum anderen daran, dass Handles immer noch "merkwürdige" Perl-Daten sind.

Die lexikalische Variable $m ist eine Referenz auf einen anonymen Typeglob. Mit *$m bewirkt man eine De-Referenzierung, ich würde das nicht als "Glob auf Glob" interpretieren. *$m->{FOO} = 123; ist also ein Zugriff auf den Hash-Eintrag im Glob *$m. Man kann, wenn man Spaß dran hat, daneben auch noch den Skalaren und den Array-Slot verwenden:

Code (perl): (dl )
1
2
3
@{*$m} = qw(glib glob);
*$m->[0]   = 'glub';
${*$m} = 'Scalar Ref';


Zum Betrachten der Einträge eignet sich übrigens CPAN:Data::Dump, der solche anonymen Typeglobs auflöst:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use strict;
use base qw(IO::Socket::INET);
use Data::Dump qw(dump);

my $host = 'smtp.mail.yahoo.com';
my $m = main->new(PeerAddr => "$host:25", Timeout => 1) or die $@;

*$m->{FOO} = 123;  # Glob auf Glob

@{*$m} = qw(glib glob);
*$m->[0]   = 'glub';

${*$m} = 'Scalar Ref';

dump  $m;


Ausgabe:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
do {
require Symbol;
my $a = bless(Symbol::gensym(), "main");
*{$a} = \"Scalar Ref";
*{$a} = ["glub", "glob"];
*{$a} = {
FOO => 123,
io_socket_domain => 2,
io_socket_proto => 6,
io_socket_timeout => 1,
io_socket_type => 1,
};
$a;
}

Es gehört sich allerdings nicht, auf diese Weise in fremden Objekten zu arbeiten, dabei kann auch mal was kaputtgehen.

Im Gegensatz dazu erzeugt *m->{FOO} = 'foo'; einen Eintrag in der lokalen Symbol-Tabelle, man kann genauso %main::m = (FOO => 'foo') schreiben. Man spart sich ein paar Buchstaben, umschifft das use strict; - aber für gute Praxis halte ich das nicht.

View full thread Schreibweise für GLOB