Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

Re: Dereferencing arrays

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


in reply to <SOLVED>Dereferencing arrays

The first thing that screamed at me when reading your code is that this:

sub mergeSort( \@arrayRef ) {

Isn't a legal Perl construct. And sure enough, running a syntax check on your code exactly as posted produces:

C:\test>perl -c junk92.pl Illegal character in prototype for main::mergeSort : \@arrayRef at jun +k92.pl line 27. Scalar value @leftSide[$i] better written as $leftSide[$i] at junk92.p +l line 40. Scalar value @leftSide[$i] better written as $leftSide[$i] at junk92.p +l line 41. Scalar value @rightSide[$i - $middle] better written as $rightSide[$i +- $middle] at junk92.pl line 47. Scalar value @rightSide[$i - $middle] better written as $rightSide[$i +- $middle] at junk92.pl line 48. Prototype mismatch: sub main::mergeSort (\@) vs (\@arrayRef) at junk92 +.pl line 55. Scalar value @groupA[$i] better written as $groupA[$i] at junk92.pl li +ne 62. Scalar value @groupB[$j] better written as $groupB[$j] at junk92.pl li +ne 62. Scalar value @groupA[$i] better written as $groupA[$i] at junk92.pl li +ne 63. Scalar value @groupB[$j] better written as $groupB[$j] at junk92.pl li +ne 67. Scalar value @groupA[$i] better written as $groupA[$i] at junk92.pl li +ne 73. Scalar value @groupB[$j] better written as $groupB[$j] at junk92.pl li +ne 78. junk92.pl syntax OK

Which means you've either been ignoring the messages; or you added strict and warnings for posting.

Fix that lot, then come back and someone will explain to you why this will never work:

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

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: Dereferencing arrays
Select or Download Code
Re^2: Dereferencing arrays
by divitto (Novice) on Mar 19, 2014 at 20:18 UTC

    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++; } }

      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

      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?

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (11)
As of 2014-09-19 16:13 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (143 votes), past polls