Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

Re^5: Dereferencing arrays

by BrowserUk (Pope)
on Mar 19, 2014 at 21:11 UTC ( #1078992=note: print w/ replies, xml ) Need Help??


in reply to Re^4: Dereferencing arrays
in thread <SOLVED>Dereferencing arrays

Because you cannot pass arrays to subroutines; you can only pass a (single) list.

This reality stems from this:

( @a, @b ) = (1..10, 'a'..'b'); print @a;; 1 2 3 4 5 6 7 8 9 10 a b print @b;;

There is nothing to delimit the two different lists on the right hand side; so everything -- the numbers and the letters -- gets assigned to @a; nothing to @b;

Similarly, when you do this:

someFunction( @a, @b, $c );

All the items from both arrays and the single scalar get concatenated into a single list, which inside the function you address as the array @_.

When you assign @_ to two arrays and a scalar inside your function:

my ( @groupA, @groupB, $dataRef ) = @_;

The information about which elements of @_ came from which argument has been lost; so everything gets assigned to @groupA and nothing to the other two variables.

Hence if you want to pass multiple arrays (or hashes; or combination thereof) to a function, you have to pass references to them and dereference internally.

It might sound like a limitation, but once you start using your function to sort arrays of any size, you'll be glad of the efficiency that results.


With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.


Comment on Re^5: Dereferencing arrays
Select or Download Code
Re^6: Dereferencing arrays
by divitto (Novice) on Mar 19, 2014 at 21:27 UTC

    Thank you very much, this clarifies everything. I wasn't fully aware of how @_ worked. I will do more reading on it for sure. Thanks again!

      Just for fun, here's your code reworked to be a little more idiomatic:

      #!/usr/bin/perl use strict; use warnings; use Data::Dumper; my @unsortedData = ( 5, 4, 7, 2, 1, 3, 6, 9, 8, 10 ); print "@unsortedData\n"; mergeSort( \@unsortedData ); print "@unsortedData\n"; sub mergeSort { my( $data ) = @_; return $data if @$data < 2; # if there is less then two items it' +s already sorted!! my $middle = @$data / 2; my $leftSide = [ @$data[ 0 .. $middle -1 ] ]; my $rightSide = [ @$data[ $middle .. $#{ $data } ] ]; mergeSort( $leftSide ); mergeSort( $rightSide ); merge( $leftSide, $rightSide, $data ); return $data; } sub merge { my ( $groupA, $groupB, $dataRef ) = @_; my( $i, $j, $k ) = (0)x3; @$dataRef[$k++] = $groupA->[$i] <= $groupB->[$j] ? $groupA->[$i++] : $groupB->[$ +j++] while $i < @$groupA && $j < @$groupB; @$dataRef[$k++] = $groupA->[$i++] while $i < @$groupA; @$dataRef[$k++] = $groupB->[$j++] while $j < @$groupB; }

      It also demonstrates something to be aware of; namely, it doesn't use a variable: $sortedData!


      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1078992]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (4)
As of 2014-11-23 04:01 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My preferred Perl binaries come from:














    Results (128 votes), past polls