1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#!/usr/bin/perl -w use strict; use warnings; use Data::Dumper; my %test = (1=>'a',3=>'c'); print Dumper(\%test); test_sub(\%test); print Dumper(\%test); sub test_sub { my ($test) = @_; %$test = (); # gut %{$test} = (); # besser? was ist richtiger? }
1 2 3 4 5 6 7 8 9 10 11 12 13 14
my %h = ( 1 => 'foo', 2 => 'bar', ); f(\%h); sub f{ my $ref = shift; $ref->{1} = 'otto'; return 'egal'; } print $h{1}; # otto
undef %h;
1 2 3 4 5 6 7 8 9 10 11
fx(%ENV); sub fx{ my %args = ( foo => 1, bar => 2, baz => 'default', @_ ); print $args{foo}; # 1 }
2011-04-09T19:07:28 biancaHi Rolf,
danke für die Ausführungen. Das interessiert mich aber alles nicht und war auch nicht meine Frage.
QuoteIch übergebe an die sub eine Referenz auf das Hash des Hauptprogramms. Und die sub soll in einem ganz bestimmten Fall das Hash leer machen. Ich habe festgestellt, dass dies mittels %$test = (); und auch mittels %{$test} = (); möglich ist und auf das selbe raus kommt.
Kann man beide Varianten gleich wählen oder wäre eine von beiden aus bestimmten Gründen vorzuziehen?
1 2
%{$self->{'hier ist ein hash drin'}}; # ok, der Interpreter weiß Bescheid %$self->{'hier ist ein hash drin'}; # wrong, gibt Fehlermeldung
2011-04-09T19:16:03 rostiDer Grund ist die Dereferenzierung, im zweiten Fall würde der Interpreter meinen, $self wäre der hash, was manchmal, aber nicht immer so ist.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
use warnings; use strict; use Data::Dump qw(dump); my %h = ( 1 => { 1 => 'foo', 2 => 'bar', }, 2 => [], 3 => 'foo', ); clear(\%h); sub clear{ my $ref = shift; %$ref->{1} = (); # { 1 => undef, 2 => [], 3 => "foo" } %{$ref->{1}} = (); # { 1 => {}, 2 => [], 3 => "foo" } } print dump \%h;
2011-04-09T19:58:09 GwenDragonIch habe mir angewöhnt, öfters die {} bei Variablen und "Umwandlungen" (Casts) von Referenzen zu setzen, damit es auch bei komplexeren Konstrukten klar ist, auf was das Sigil % oder $ bezieht.
1 2 3 4 5 6 7
my $r = $ref->{1}; # Abkürzen ;) # btw. my %hash = %{$ref->{1}}; # %hash ist eine Kopie! # und hier: my %hash = %$ref->{1}; # gibts sogar eine Fehlermeldung # Reference found where even-sized list expected at