Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

Best way to take reference to an array \ or []

by vinoth.ree (Prior)
on Jan 22, 2013 at 11:30 UTC ( #1014631=perlquestion: print w/ replies, xml ) Need Help??
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

Comment on Best way to take reference to an array \ or []
Select or Download Code
Re: Best way to take reference to an array \ or []
by tobyink (Abbot) 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.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1014631]
Approved by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (14)
As of 2015-07-06 21:37 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (83 votes), past polls