in reply to Re: passing information into a hash
in thread passing information into a hash

I have a question about this line
$unsubscribe{$address} = [@dbase_array];
I guess I'm wondering if that is the same as this:
$unsubscribe{$address} = \@dbase_array;
technically?? Both create a reference to the array, but do they both accomplish the same exact thing? Or are they somehow different?

Replies are listed 'Best First'.
3Re: passing information into a hash
by jeffa (Bishop) on Sep 29, 2003 at 14:54 UTC
    Good question. :) For this particular case, i probably should have used your second snippet (take a reference to the array instead of copying it into a new anonymous one). Consider these:
    use Data::Dumper; my @array = qw(foo bar baz); my %hash; for (1..5) { my @array = qw(foo bar baz); $hash{$_} = \@array; undef @array; } print Dumper \%hash; for (1..5) { my @array = qw(foo bar baz); $hash{$_} = [@array]; undef @array; } print Dumper \%hash;
    I usually stick with an explicit copy since it tends to keep me out of trouble, but there are times when you do want to take a reference, and you just have to be careful when you do.

    jeffa

    L-LL-L--L-LL-L--L-LL-L--
    -R--R-RR-R--R-RR-R--R-RR
    B--B--B--B--B--B--B--B--
    H---H---H---H---H---H---
    (the triplet paradiddle with high-hat)
    
      I want to be clear about this - I don't quite understand yet. Does @array copy the array and then create an anonymous reference to the new array? Or does it just create a new reference to the existing @array? TIA.

        Don't forget to escape square brackets, the left one is all you really need to worry about: [@array]

        Anyways ... [@array] copies the contents of the array into a new anonymous array reference. I think the name for the collection of those contents is called a list ... so you could say that the l-value of [@array] is an anymous array that contains a copy of @array's list ... i think. Understanding the difference between Perl's lists and arrays can be tricky, and i often get it wrong. :/

        Here is some more code to study:

        #!/usr/bin/perl -l use strict; use warnings; use Data::Dumper; my @array = 0..4; my $ref1 = \@array; my $ref2 = \@array; my $copy1 = [@array]; my $copy2 = [@array]; print Dumper $ref1,$copy1; print for ($ref1,$ref2,$copy1,$copy2); undef @array; print Dumper $ref2,$copy2;

        jeffa

        L-LL-L--L-LL-L--L-LL-L--
        -R--R-RR-R--R-RR-R--R-RR
        B--B--B--B--B--B--B--B--
        H---H---H---H---H---H---
        (the triplet paradiddle with high-hat)