Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to do sum of hash reference slice?

Tags:

perl

I'm trying to get a sum of a hash reference slice, but I am failing

#!/usr/bin/env perl

use strict;
use warnings FATAL => 'all';
use feature 'say';
use autodie ':all';
use List::Util 'sum';

my %h = (
    'a' => 1,
    'b' => 2,
    'c' => 3
);

my @letters = ('a','b');
say sum(@h{@letters}); # 1+2 = 3, which is correct
my $h = \%h; # create a reference
#say sum(@{ $h->{ @letters } }); # says "uninitialized value"
#say sum(@{ $h }->{@letters}); # not an array reference
say sum(@h->{@letters}); # @h requires explicit package name

I can get the sum of the hash slice, but not the sum of a slice of a hash reference.

All three methods that I've tried have failed to get the sum, and I've indicated the errors in the comments.

How can I get the sum of a hash reference slice?

like image 704
con Avatar asked Jan 21 '21 23:01

con


1 Answers

Dereference the $h with the @ sigil but follow it with a curly brace:

say sum(@{ $h }{ @letters });

If the thing inside the @{...} is a simple scalar, the curly braces are optional. So, you can shorten it to

say sum(@$h{ @letters });

The third possible syntax is the Postfix Reference Slicing (needs 5.20+):

say sum($h->@{ @letters });
like image 119
choroba Avatar answered Nov 18 '22 11:11

choroba