The above note by Errto explained why \@data works. As s?he said, it creates a reference to the array @data, and stores it in the scalar.
Since you said you're confused by how both methods work, let me clear up eric256's method.
$array_ref = [ ]; creates a new, empty array, and returns the reference to it. In this case, we assign it to $array_ref.
$array2_ref = [1, 2, 3, 4]; creates a new array and initializes it with the values supplied. It returns the reference, which we once again store.
$radius_ref = [@data] will create a new array initialized with the contents of @data.
There's a really important distinction between using [@data] and \@data. They both create array references, but the method with the brackets creates a new array, while the slash method references your existing array. The example below should clear up any confusion you have.
my @data = (1,2,3,4);
my $existing_ref = \@data;
my $new_ref = [@data];
$existing_ref->[0] = "a";
$new_ref->[2] = "c";
Now, @data contains
(a,2,3,4)
and $new_ref points to an array the contains
(1,2,c,4)
Hope that helped. | [reply] [d/l] [select] |
Hi fortesque,
In your code it seems like you want the variable $radius_ref to contain a reference to the array @radius. And I understand why you might expect that simply assigning it like my $radius_ref = @radius; might do that for you, and you wouldn't be the only one. Assigning to a scalar variable is one example of what's called scalar context in Perl. And when you have an array in scalar context, like here, what you get is the length of the array (that is, the number of elements in it). So $radius_ref will contain the number of elements in the array @radius.
Whereas \@radius will take a reference to the array, which is what you want.
This is explained in the Arrays section of perlintro, and in more detail in perldata.
| [reply] [d/l] [select] |