Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Re^2: Dereferencing arrays

by divitto (Novice)
on Mar 19, 2014 at 20:18 UTC ( #1078977=note: print w/ replies, xml ) Need Help??


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

That was me messing with prototypes another topic im still learning in perl. however my code above is directly copy pasted from my real code i changed nothing and i did not just add use strict or use warnings for posting, yet i get nothing like what you got. ill fix the issues, but this leads me to think something is wrong with my enviorment.. EDIT: Oops lol the warnings were scrolling off screen in my terminal i feel dumb. Still get the error though. heres the new code:

#!/usr/bin/perl use strict; use warnings; use Data::Dumper; #protos # sub mergeSort( \@ ); my @unsortedData = ( 5, 4, 7, 2, 1, 3, 6, 9, 8, 10 ); # show the original data to screen for( @unsortedData ) { print "$_ "; } print "\n"; my $sortedData = &mergeSort( \@unsortedData ); # show the new data to screen for( @$sortedData ) { print "$_ "; } print "\n"; ### dereferencing of arrays isnt working in below method sub mergeSort { my ( $data ) = @_; if( @$data < 2 ) { return $data; } # if there is less then two it +ems it's already sorted!! use integer; #split the array into two parts my $middle = @$data / 2; print "middle: $middle\n"; my @leftSide = (); print "LeftSide:\n"; for( my $i = 0; $i < $middle; $i++ ) { $leftSide[$i] = @$data[$i]; print "$leftSide[$i] "; } print "\n"; my @rightSide = (); print "RightSide:\n"; for( my $i = $middle; $i < @$data; $i++ ) { $rightSide[$i - $middle] = @$data[$i]; print "$rightSide[$i - $middle] "; } print "\n"; &mergeSort( @leftSide ); &mergeSort( @rightSide ); &merge( @leftSide, @rightSide, $data ); return $data; } sub merge { my ( @groupA, @groupB, $dataRef ) = @_; my $i = 0; my $j = 0; my $k = 0; while( $i < @groupA && $j < @groupB ) { if( $groupA[$i] <= $groupB[$j] ) { @$dataRef[$k] = $groupA[$i]; $i++; } else { @$dataRef[$k] = $groupB[$j]; $j++; } $k++; } while( $i < @groupA ) { @$dataRef[$k] = $groupA[$i]; $i++; $k++; } while( $j < @groupB ) { @$dataRef[$k] = $groupB[$j]; $j++; $k++; } }


Comment on Re^2: Dereferencing arrays
Download Code
Re^3: Dereferencing arrays
by tobyink (Abbot) on Mar 19, 2014 at 20:24 UTC

    Your problems are pretty much all caused by misuse of prototypes. Just get rid of them. There is rarely a good reason to give Perl subs prototypes.

    use Moops; class Cow :rw { has name => (default => 'Ermintrude') }; say Cow->new->name
Re^3: Dereferencing arrays
by BrowserUk (Pope) on Mar 19, 2014 at 20:37 UTC

    Compare this code (which works) with your version and ask questions about any differences you do not understand:

    #!/usr/bin/perl use strict; use warnings; use Data::Dumper; my @unsortedData = ( 5, 4, 7, 2, 1, 3, 6, 9, 8, 10 ); # show the original data to screen for( @unsortedData ) { print "$_ "; } print "\n"; my $sortedData = mergeSort( \@unsortedData ); # show the new data to screen for( @$sortedData ) { print "$_ "; } print "\n"; ### dereferencing of arrays isnt working in below method sub mergeSort { my ( $data ) = @_; if( @$data < 2 ) { return $data; } # if there is less then two it +ems it's already sorted!! use integer; #split the array into two parts my $middle = @$data / 2; print "middle: $middle\n"; my @leftSide = (); print "LeftSide:\n"; for( my $i = 0; $i < $middle; $i++ ) { $leftSide[$i] = @$data[$i]; print "$leftSide[$i] "; } print "\n"; my @rightSide = (); print "RightSide:\n"; for( my $i = $middle; $i < @$data; $i++ ) { $rightSide[$i - $middle] = @$data[$i]; print "$rightSide[$i - $middle] "; } print "\n"; mergeSort( \@leftSide ); mergeSort( \@rightSide ); merge( \@leftSide, \@rightSide, $data ); return $data; } sub merge { my ( $groupA, $groupB, $dataRef ) = @_; my $i = 0; my $j = 0; my $k = 0; while( $i < @$groupA && $j < @$groupB ) { if( $groupA->[$i] <= $groupB->[$j] ) { @$dataRef[$k] = $groupA->[$i]; $i++; } else { @$dataRef[$k] = $groupB->[$j]; $j++; } $k++; } while( $i < @$groupA ) { @$dataRef[$k] = $groupA->[$i]; $i++; $k++; } while( $j < @$groupB ) { @$dataRef[$k] = $groupB->[$j]; $j++; $k++; } }

    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.

      i understand that you made the merge method take references but i am confused to why. could you explain that to me?

        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.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (9)
As of 2014-12-20 23:19 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    Is guessing a good strategy for surviving in the IT business?





    Results (99 votes), past polls