in reply to Re^2: a reference by any other name...
in thread a reference by any other name...

I think there is a confusion of nomenclature here. \ returns a reference to something and that reference can be assigned to a scalar variable, which is then said to be a reference to the original something.

A copy of the reference by using my $ref2 = $ref1; generates the same result as my $ref2 = \$something;. You seem to be talking about some sort of alias, somewhat like a *nix file system hard link. I am having trouble imagining a situation where you would require such a thing in Perl. Perhaps you need to show us a code snippet to illustrate the problem you are having?


DWIM is Perl's answer to Gödel

Replies are listed 'Best First'.
Re^4: a reference by any other name...
by blogical (Pilgrim) on Feb 20, 2006 at 02:42 UTC
    The situation is thus:
    I'd like to use hashed and arrayed data, being passed into a function as references, using non-de-referencing notation.
    Instead of $array_ref->[0], I want to assign the data referenced by $array_ref to something like @array_by_another_name, so that I can then just say $array_by_another_name[0].
    If I just assign the de-referenced data to a like variable I will get a copy... (ie my @array2 = @{$array_ref}; is not what I want).
    my %foo = ('a' => 1); my_sub(\%foo); sub my_sub { my $foo_ref = shift; #Now I want to do something here to name %bar as pointing to %foo: #my %bar ????? $foo_ref; #such that print $bar{a}; #prints '1' #and if I were to $bar{b} = 2; }; print $foo{b}; #prints '2'
    I think I have a good grasp on wrangling references... but I'm always up for elucidation. This would indeed be like a hard reference on a unix system- it increases the reference count, but is otherwise treated like it IS what it refers to- no de-referencing needed.

      Unless Aristotle's alias module sugestion does what you want, I think you are stuck. There is a little syntactic sugar - the -> is optional (sort of):

      use strict; use warnings; my @array = qw(a b c d); printArray (\@array); sub printArray { my $aref = shift; print "First element by ref = " . $aref->[0] . "\n"; print "First element by sugar = " . $$aref[0] . "\n"; }

      Prints:

      First element by ref = a First element by sugar = a

      Appart from that, at the end of the day I don't think aliasing is going to get you a lot except some pain. The keystrokes saved just won't add up to enough to compensate for the bugs that are bound to be introduced by obfusicating your code in that fashion - unless that is the intent of course. :)

      Update: Oh, package variables. Perl does have some nasty surprises doesn't it :)


      DWIM is Perl's answer to Gödel