in reply to Trying to optimize de-referenced hash slice without scope variables...

write:   @{$_[3]}{'a','b','c','d'}; since perl reads it as @{$_}[3]{...} otherwise.
Boris

Replies are listed 'Best First'.
Re^2: Trying to optimize de-referenced hash slice without scope variables...
by monsieur_champs (Curate) on Jun 15, 2004 at 17:26 UTC

    Fellow boriz
    Thank you very much for your suggestion, but I'm not sure if

    perl -MData::Dumper -e "print Dumper @{$_[3]}{'a','b','c','d'}, $_[3]; + " $VAR1 = undef; $VAR2 = undef; $VAR3 = undef; $VAR4 = undef; $VAR1 = undef; $VAR2 = undef; $VAR3 = undef; $VAR4 = undef; $VAR1 = undef; $VAR2 = undef; $VAR3 = undef; $VAR4 = undef; $VAR5 = '1';
    is the same thing as
    perl -MData::Dumper -e 'print Dumper @$data{"a","b","c"}, $data' $VAR1 = undef; $VAR2 = undef; $VAR3 = undef; $VAR4 = { 'c' => undef, 'a' => undef, 'b' => undef };
    or I'm doing something really wrong here, or your data structure definition is not the same as my example. :-) Nice try, anyway.

        Autovivification shouldn't fill in the data structure as I access it? So both the accesses should produce the same data structures (that's autovivification work, I guess), and Data::Dumper should produce the same result in both cases.

        BTW, here is the result, again:

        perl -MData::Dumper $data = { a=>'b', c=>'d', e=>'h', i=>'j' }; $_[3] = { a=>'b', c=>'d', e=>'h', i=>'j' }; print Dumper @$data{'a','c','e'}; print "\n"; print Dumper @{$_[3]}{'a','c','e'}; print "\n";
        and the result was:
        $VAR1 = 'b'; $VAR2 = 'd'; $VAR3 = 'h'; $VAR1 = 'b'; $VAR2 = 'd'; $VAR3 = 'h';
        exactly as expected. I'm confused. What's the problem with auto-vivification? Its supposed to fill in the "gore details", it isn't?

        Thank you for your time and patience!

      My perl works this way, Im sure there is another mistake.
      #!/usr/bin/perl use Data::Dumper; %xx = ( a => 1, b => 2 ); sub inputBox{ @{$_[3]}{'a','b','c','d'}; } sub inputBox2{ my $data = $_[3]; @$data{'a','b','c','d'}; } print Dumper (inputBox( 1,2,3,\%xx)); print Dumper (inputBox2( 1,2,3,\%xx));
      Boris