reference/alias in perl vs reference/alias in C++

Discussion in 'C++' started by grocery_stocker, May 23, 2008.

  1. How are references and aliases in perl different than references in
    aliases in C++?
    grocery_stocker, May 23, 2008
    #1
    1. Advertising

  2. grocery_stocker

    Jim Gibson Guest

    In article
    <>,
    grocery_stocker <> wrote:

    > How are references and aliases in perl different than references in
    > aliases in C++?


    Some differences (not exhaustive):

    Aliases in Perl are like references in C++: a different way of
    accessing the same object.

    References in Perl are like pointers in C/C++: indirect access to an
    object. However, in Perl you cannot do arithmetic on references the way
    you can for C/C++ pointers (e.g. *(p++) = getchar();)

    In Perl, references are scalars, not separate pointer types as in C/C++.

    In C/C++, arrays are really pointers to the first element in a
    contiguous set of elements. In Perl, arrays are separate objects. A
    reference to an array in Perl is different than a reference to one of
    the members of the array.

    --
    Jim Gibson
    Jim Gibson, May 23, 2008
    #2
    1. Advertising

  3. On May 23, 12:22 pm, Jim Gibson <> wrote:
    > In article
    > <>,
    >
    > grocery_stocker <> wrote:
    > > How are references and aliases in perl different than references in
    > > aliases in C++?

    >
    > Some differences (not exhaustive):
    >
    > Aliases in Perl are like references in C++: a different way of
    > accessing the same object.
    >
    > References in Perl are like pointers in C/C++: indirect access to an
    > object. However, in Perl you cannot do arithmetic on references the way
    > you can for C/C++ pointers (e.g. *(p++) = getchar();)
    >
    > In Perl, references are scalars, not separate pointer types as in C/C++.
    >
    > In C/C++, arrays are really pointers to the first element in a
    > contiguous set of elements. In Perl, arrays are separate objects. A
    > reference to an array in Perl is different than a reference to one of
    > the members of the array.
    >
    > --
    > Jim Gibson


    Everytime I ask a question on the newsgroup, i keep on thinking "I'm
    sure things would have been a lot easier if I would have taken more
    than 6 week of FORTRAN." I don't care what anyone says. Learning to
    program on your own. mastering the core concepts without formal
    schooling, and then actually making it as a programmer takes a certain
    level of skill and internal drive. Not everyone has it.

    I think I only know a few people with no more than a high school
    education that are doing the same kind of work, for the exact same
    pay, as a person with an advanced degree in the sciences.
    grocery_stocker, May 23, 2008
    #3
  4. >On May 23, 12:22 pm, Jim Gibson <> wrote:
    >> grocery_stocker <> wrote:
    >> > How are references and aliases in perl different than references in
    >> > aliases in C++?


    >> References in Perl are like pointers in C/C++: indirect access to an
    >> object. However, in Perl you cannot do arithmetic on references the way
    >> you can for C/C++ pointers (e.g. *(p++) = getchar();)


    Another very major difference: in C pointers are just (virtual) memory
    addresses and the programmer is forced to implement his own memory
    management for objects that are addressed by pointers.
    In Perl any memory management for objects referred to by references is
    done automatically by the system.

    jue
    Jürgen Exner, May 23, 2008
    #4
  5. grocery_stocker

    Guest

    On May 23, 12:22 pm, Jim Gibson <> wrote:

    > In C/C++, arrays are really pointers to the first element in a
    > contiguous set of elements.


    That is a common misconception.

    An array is the contiguous set of elements that you mention; there is
    no extra pointer. True, the name of the array decays to a pointer to
    first element in certain contexts; but still, there is no extra
    pointer to make an array.

    > In Perl, arrays are separate objects. A
    > reference to an array in Perl is different than a reference to one of
    > the members of the array.


    That is exactly the case in C++ as well. Here is a program with a
    function that takes an array as a separate object (not as a pointer to
    its first element):

    #include <assert.h>

    typedef int TwoIntArray[2];

    void as_array(TwoIntArray & array)
    {
    // Here, the type is int[2]
    assert(sizeof(array) == sizeof(TwoIntArray));
    }

    void as_pointer(int * p)
    {
    // Here, the type is int*
    assert(sizeof(p) == sizeof(int*));
    }

    int main()
    {
    int array[2] = { 7, 42 };

    as_array(array);

    // Decays to pointer to first member
    as_pointer(array);
    }

    Ali
    , May 23, 2008
    #5
  6. On May 23, 10:48 am, grocery_stocker <> wrote:
    > How are references and aliases in perl different than references in
    > aliases in C++?


    And going off on a tanget, given something like

    #!/usr/bin/perl -w

    # global array definition
    my @array = ("a","b","c");

    sub print_array {
    foreach my $element (@array) {
    $element .= "9";
    print $element . "\n";
    }

    }

    for ($i = 0; $i < 3; $i++) {
    &print_array();
    }

    How would I prevent $elment from modifying @array?
    grocery_stocker, May 23, 2008
    #6
  7. grocery_stocker <> wrote in news:25dad38d-0e82-4c19-
    :

    > On May 23, 10:48 am, grocery_stocker <> wrote:
    >> How are references and aliases in perl different than references in
    >> aliases in C++?

    >
    > And going off on a tanget, given something like
    >
    > #!/usr/bin/perl -w


    use warnings;

    is in general preferable to -w.

    You forgot:

    use strict;

    > # global array definition


    Useless comment (it is also wrong).

    > my @array = ("a","b","c");


    my @array = qw( a b c ); # easier on the eyes

    > sub print_array {
    > foreach my $element (@array) {
    > $element .= "9";
    > print $element . "\n";
    > }
    >
    > }
    >
    > for ($i = 0; $i < 3; $i++) {
    > &print_array();
    > }


    First off, omit the & unless you know and desire its specific effect in
    this case.

    > How would I prevent $elment from modifying @array?


    $element is not modifying anything. $element is an alias to the current
    element of @array. The statement you wrote

    $element .= "9";

    is modifying the contents of @array in each iteration of the loop.

    The easiest way to avoid modifying the contents of @array would be for
    you not to modify the contents of the array.

    The name print_array is simply bad. The subroutine does not just print
    the contents of the array but prints some modification of the elements
    of the array.

    Depending on what you actually want to do, there are many different ways
    of writing such a subroutine (each of which is infinitely better than
    what you wrote).

    Some examples below. Some of these are sillier than the others.

    #!/usr/bin/perl

    use strict;
    use warnings;

    my @array = qw( a b c d e f g h i j k l );
    my %hash = @array;

    print "${_}9\n" for @array;

    print map { "${_}9\n" } @array;

    print_with_suffix( 9 => \@array );

    print_with_suffix2( 9 => @array, \@array, \%hash );

    sub print_with_suffix {
    my ($suffix, $array_ref) = @_;
    return unless ref $array_ref eq 'ARRAY';
    print "${_}$suffix\n" for @$array_ref;
    }

    sub print_with_suffix2 {
    my $suffix = shift;

    for my $arg ( @_ ) {
    if ( ref $arg eq 'ARRAY' ) {
    print_with_suffix( $suffix, $arg );
    }
    elsif ( ref $arg eq 'HASH' ) {
    print_with_suffix( $suffix, [ values %$arg ] );
    }
    else {
    print "$arg$suffix\n";
    }
    }
    }



    __END__



    --
    A. Sinan Unur <>
    (remove .invalid and reverse each component for email address)

    comp.lang.perl.misc guidelines on the WWW:
    http://www.rehabitation.com/clpmisc/
    A. Sinan Unur, May 23, 2008
    #7
  8. grocery_stocker <> wrote:
    [...]
    >my @array = ("a","b","c");

    [...]
    > foreach my $element (@array) {
    > $element .= "9";

    [...]
    >How would I prevent $elment from modifying @array?


    $element doesn't modify anything. If at all it is modified by the
    assignment and because it is an alias to to each @array element those
    are modified, too.

    Solution: just create a copy:
    my @array = ("a","b","c");
    [...]
    foreach (@array) {\
    my $element = $_ # create copy instead of aliasing
    $element .= "9";

    jue
    Jürgen Exner, May 23, 2008
    #8
  9. grocery_stocker <> wrote in
    news::

    > On May 23, 12:22 pm, Jim Gibson <> wrote:
    >> In article
    >> <>,
    >>
    >> grocery_stocker <> wrote:
    >> > How are references and aliases in perl different than references in
    >> > aliases in C++?

    >>


    [ snip Jim's explanation ]

    >> --
    >> Jim Gibson


    [ Do *NOT* quote sigs ]

    > Everytime I ask a question on the newsgroup, i keep on thinking "I'm
    > sure things would have been a lot easier if I would have taken more
    > than 6 week of FORTRAN."


    I did do some FORTRAN programming almost 20 years ago. I am not sure
    what you are getting at though.

    > I don't care what anyone says.


    Well, I am reminded of

    http://www.catb.org/~esr/faqs/hacker-howto.html#believe5

    > Learning to program on your own.


    http://en.wikipedia.org/wiki/Sentence_(linguistics)

    > mastering the core concepts without formal
    > schooling, and then actually making it as a programmer takes a certain
    > level of skill and internal drive.


    Are you referring to yourself here?

    I am not sure what "making it as a programmer" means above. On the other
    hand, almost everyday at work is an opportunity for me to run into
    someone who thinks he/she has made it as a programmer. I am not sure I
    agree with those people's self-assessments.

    > Not everyone has it.


    True.

    > I think I only know a few people with no more than a high school
    > education that are doing the same kind of work, for the exact same
    > pay, as a person with an advanced degree in the sciences.


    The only thing that shows me is that the person with the advanced degree
    in the sciences has chosen not to work in the field in which he/she
    earned the degree.

    Clearly, once one has a certain mental capability, whether one chooses
    to invest time in an advanced degree is a matter of preference. Another
    person with even superior mental capacity may choose not to "waste" five
    to seven years toiling on a project which is of interest to only a few
    people and which, as a norm, do not generate huge monetary returns on
    that investment. This is why I do not put much stock in letters before
    or after a person's name.

    Achieving that goal also takes a certain level of skill and drive.

    If I were you, I would not be so quick to pat myself on the back for
    this particular reason until I were able to compete with Physics Ph.D.'s
    in the fields in which they earned their degrees.

    You can be proud of your achievements without resorting to this silly
    argument.

    Switching back to discussing Perl ... now.

    Sinan

    --
    A. Sinan Unur <>
    (remove .invalid and reverse each component for email address)

    comp.lang.perl.misc guidelines on the WWW:
    http://www.rehabitation.com/clpmisc/
    A. Sinan Unur, May 23, 2008
    #9
  10. On May 23, 3:44 pm, "A. Sinan Unur" <> wrote:
    > grocery_stocker <> wrote innews::
    >
    > > On May 23, 12:22 pm, Jim Gibson <> wrote:
    > >> In article
    > >> <>,

    >
    > >> grocery_stocker <> wrote:
    > >> > How are references and aliases in perl different than references in
    > >> > aliases in C++?

    >
    > [ snip Jim's explanation ]
    >
    > >> --
    > >> Jim Gibson

    >
    > [ Do *NOT* quote sigs ]
    >
    > > Everytime I ask a question on the newsgroup, i keep on thinking "I'm
    > > sure things would have been a lot easier if I would have taken more
    > > than 6 week of FORTRAN."

    >
    > I did do some FORTRAN programming almost 20 years ago. I am not sure
    > what you are getting at though.


    Well, FORTRAN was my first formal introduction to structured
    programming. Is 6 weeks enough to actually learn how to think
    logically?
    >
    > > I don't care what anyone says.

    >
    > Well, I am reminded of
    >
    > http://www.catb.org/~esr/faqs/hacker-howto.html#believe5
    >
    > > Learning to program on your own.

    >
    > http://en.wikipedia.org/wiki/Sentence_(linguistics)
    >
    > > mastering the core concepts without formal
    > > schooling, and then actually making it as a programmer takes a certain
    > > level of skill and internal drive.

    >
    > Are you referring to yourself here?
    >


    No. I think some people that come mind are certain former Netscape and
    FreeBSD engineers.

    > I am not sure what "making it as a programmer" means above. On the other
    > hand, almost everyday at work is an opportunity for me to run into
    > someone who thinks he/she has made it as a programmer. I am not sure I
    > agree with those people's self-assessments.
    >
    > > Not everyone has it.

    >
    > True.
    >
    > > I think I only know a few people with no more than a high school
    > > education that are doing the same kind of work, for the exact same
    > > pay, as a person with an advanced degree in the sciences.

    >
    > The only thing that shows me is that the person with the advanced degree
    > in the sciences has chosen not to work in the field in which he/she
    > earned the degree.
    >
    > Clearly, once one has a certain mental capability, whether one chooses
    > to invest time in an advanced degree is a matter of preference. Another
    > person with even superior mental capacity may choose not to "waste" five
    > to seven years toiling on a project which is of interest to only a few
    > people and which, as a norm, do not generate huge monetary returns on
    > that investment. This is why I do not put much stock in letters before
    > or after a person's name.
    >
    > Achieving that goal also takes a certain level of skill and drive.
    >
    > If I were you, I would not be so quick to pat myself on the back for
    > this particular reason until I were able to compete with Physics Ph.D.'s
    > in the fields in which they earned their degrees.
    >
    > You can be proud of your achievements without resorting to this silly
    > argument.
    >
    > Switching back to discussing Perl ... now.
    >


    Yes. We now go back to our regular discussion on Perl.
    grocery_stocker, May 24, 2008
    #10
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Daniel Eloff
    Replies:
    2
    Views:
    546
    Dennis Lee Bieber
    Jul 25, 2004
  2. Replies:
    4
    Views:
    419
    Richard Herring
    Oct 4, 2005
  3. Replies:
    5
    Views:
    326
    Alf P. Steinbach
    Sep 18, 2006
  4. Eric Sosman
    Replies:
    6
    Views:
    295
    markspace
    Jul 19, 2010
  5. Lim kiang Leng
    Replies:
    3
    Views:
    205
    Ben Morrow
    Jul 18, 2004
Loading...

Share This Page