in reply to hash to sub

While what you have works (shift removes an element from the @_ array), a more normal sort of thing would be like below.

In the first line of the sub, assign local names to the input parameters by putting them into a list context with parens and assigning @_ to that. This is helpful as documentation of the interface - the main thing a caller would need to know is right there on that one line (assuming that we've got some good names).

It is possible to just de-reference the hash_ref which avoids having to make a local copy of the hash (if the hash is big, this will speed things up considerably).

#!/usr/bin/perl -w use strict; use Data::Dumper; # a core module (no installation needed) my %hash = ( a=> 11, b=>22); my $value = ("something"); marine ($value, \%hash); sub marine { my ($line, $hash_ref) = @_; # parens needed for list context print "$line\n"; print "hash value of key a is $hash_ref->{a}\n"; #no local copy my %local_hash_copy = %$hash_ref; #makes complete local copy print Dumper \%local_hash_copy; } __END__ something hash value of key a is 11 $VAR1 = { 'a' => 11, 'b' => 22 };