lapointd has asked for the wisdom of the Perl Monks concerning the following question:

I've frequently run into the following problem. I've searched Perlmonks, and seen a few similar situations , but I didn't see a clear answer. It sounds like it is a bug in Perl? When passing an array as a reference to a subroutine, like this:
subroutine(\@list)
and using it internal to the subroutine, like this:
$count=$#(@$listref);
I get the folling error message, only in debug mode:
"Bizarre copy of ARRAY in leave at..."
The code works fine, and does the right thing, it just fails in debug mode. The inelegant work-around is to do an intermediate step:
my @local_array=@$list; my $count=$#local_array;
Any ideas on this problem?

Replies are listed 'Best First'.
Re: Bizarre copy of ARRAY in leave at...
by BrowserUk (Patriarch) on Jan 19, 2004 at 17:36 UTC

    Actually, the problem is your syntax is bizarre :)

    To get the highest index of an array from a reference to it the syntax should be $#{ $aref } not $#{ @$aref } which you have. The fact that your code works silently, is probably a bug:)

    #! perl -slw use strict; sub get_size{ my ($aref ) = @_; return $#{@$aref}; } my @a = ( 1..10 ); print get_size( \@a ); __END__ P:\test>322384 9 P:\test>perl -d 322384.pl Loading DB routines from perl5db.pl version 1.22 Editor support available. Enter h or `h h' for help, or `perldoc perldebug' for more help. main::(322384.pl:9): my @a = ( 1..10 ); DB<1> s main::(322384.pl:11): print get_size( \@a ); DB<1> s main::get_size(322384.pl:5): my ($aref ) = @_; DB<1> s main::get_size(322384.pl:6): return $#{@$aref}; DB<1> s main::get_size(322384.pl:6): return $#{@$aref}; DB<1> s Bizarre copy of ARRAY in leave at 322384.pl line 6. main::get_size('ARRAY(0x19ede94)') called at 322384.pl line 11 Debugged program terminated. Use q to quit or R to restart, use O inhibit_exit to avoid stopping after program termination, h q, h R or h O to get additional info. DB<1> Config::DESTROY(c:/Perl/lib/Config.pm:1198): 1198: sub DESTROY { } DB<1> q #### change $#{@$aref} to $#{ $aref } P:\test>322384 9 P:\test>perl -d 322384.pl Loading DB routines from perl5db.pl version 1.22 Editor support available. Enter h or `h h' for help, or `perldoc perldebug' for more help. main::(322384.pl:9): my @a = ( 1..10 ); DB<1> s main::(322384.pl:11): print get_size( \@a ); DB<1> s main::get_size(322384.pl:5): my ($aref ) = @_; DB<1> s main::get_size(322384.pl:6): return $#{$aref}; DB<1> s main::get_size(322384.pl:6): return $#{$aref}; DB<1> s 9 Debugged program terminated. Use q to quit or R to restart, use O inhibit_exit to avoid stopping after program termination, h q, h R or h O to get additional info. DB<1> q

    Examine what is said, not who speaks.
    "Efficiency is intelligent laziness." -David Dunham
    "Think for yourself!" - Abigail
    Timing (and a little luck) are everything!

      ...not $#{ @$aref } which you have.

      But he doesn't have {}, he has (), as in

      $round = [ 1 .. 10]; die $#( $round ); __END__ Missing comma after first argument to die function at - line 2, near " +);" Execution of - aborted due to compilation errors.
Re: Bizarre copy of ARRAY in leave at...
by Zaxo (Archbishop) on Jan 20, 2004 at 06:45 UTC

    Along the same lines as BrowserUK points out, my $last_index = $#$listref; works fine.

    After Compline,
    Zaxo

Re: Bizarre copy of ARRAY in leave at...
by Abigail-II (Bishop) on Jan 19, 2004 at 16:39 UTC
    It's probably a bug in Perl, but you haven't told us the entire story. Where are $listref and $list coming from? Do you have a small self-contained program that exhibits this behaviour?

    Abigail

Re: Bizarre copy of ARRAY in leave at...
by ysth (Canon) on Jan 20, 2004 at 07:45 UTC
    Please expunge the word "listref" from your vocabulary. There is no such thing, and using the term it will only lead you into confusion. A list is not an array, and you can only take a reference to an array.