http://www.perlmonks.org?node_id=1014631

vinoth.ree has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks
use strict; use warnings; use Data::Dumper; sub get_user_details { my @temp; my %user_details; while (@temp = getpwent()) { $user_details{$temp[0]} = [@temp] ; } return \%user_details; } my $hash_ref = get_user_details(); print Dumper $hash_ref;

In the above code am trying to get the user details into the %user_details hash, the keys will be the user name and value will be in the array, For Ex.

'hema' => [ 'hema', 'x', 1000, 1000, '', '', 'Hema,,,', '/home/hema', '/bin/bash' ],
I thought to save the array as array reference, for each users, So I tried to take the array reference with \ (backslash), this is the normal method I use to take reference to a array. Ex:
use strict; use warnings; use Data::Dumper; sub return_arr_ref { my @array = (1,2,3,4,5,6,7); return \@array; } my $array_ref = return_arr_ref(); print Dumper $array_ref;
But this method does not worked for me.

I tried the another method to take reference to an array as [], it works fine for me, Now its confusing me.

Which method I need to use always to take reference to an array ?

Notice:

When I use my inside that while loop like  while (my @temp = getpwent())) that \ method of taking reference works fine.

Update:

updated the code, changed $arr_ref to $hash_ref, as point out by muba

Replies are listed 'Best First'.
Re: Best way to take reference to an array \ or []
by tobyink (Canon) on Jan 22, 2013 at 11:35 UTC

    They do different things...

    use 5.010; use strict; use warnings; my @array = ('a' .. 'c'); sub get_ref1 { \@array }; # returns a ref to @array sub get_ref2 { [@array] }; # creates an anonymous array and returns r +ef to it my $ref1 = get_ref1(); push @$ref1, 'd'; say "(@$ref1) and (@array) - note 'd' has been added to original array +"; my $ref2 = get_ref2(); push @$ref2, 'e'; say "(@$ref2) and (@array) - note 'e' has NOT been added to original a +rray";
    package Cow { use Moo; has name => (is => 'lazy', default => sub { 'Mooington' }) } say Cow->new->name

      Ok. thats why I am getting the array ref correctly on using [] and "my" declares the @temp array each time so \ works here!!! Correct me if I am wrong!

        Note that your code, especially the line

        return \%user_details;
        will return a hash reference.