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

Hi monks,i want to bring to hashes in a subroutine but subroutine doesn't recognize one of them.please help me.

sub versatility{ my(%genome1,%genome2)=@_; for my $key (keys %genome1) { my @genome1=$genome1{$key}=~ /(\d+)/g; my @genome2=$genome2{$key}=~ /(\d+)/g; my $m=($genome1[1]-$genome2[1]); my $n=($genome1[0]-$genome2[0]); if( $n==0){ print "number of occurance for $key in two genome are same\n";} else{ my $slope=$m/$n; print "domain versatility= $slope\n";} } }

Replies are listed 'Best First'.
Re: two hashes in subroutin
by BrowserUk (Patriarch) on Aug 18, 2011 at 10:33 UTC

    Presumably you are calling your sub like this:

    versatility( %hash1, %hash2 );

    That doesn't work. All the keys and values will be assigned to %genome1 inside the subroutine and %genome2 will get nothing.

    You need to re-write your subroutine to take hash references:

    sub versatility { my( $genome1, $genome2 ) = @_; for my $key ( keys %{ $genome1 } ) { my @genome1 = $genome1->{ $key } =~ /(\d+)/g; my @genome2 = $genome2->{ $key } =~ /(\d+)/g; my $m = ( $genome1[1] - $genome2[1] ); my $n = ( $genome1[0] - $genome2[0] ); if( $n == 0 ){ print "number of occurance for $key in two genome are same +\n"; } else{ my $slope = $m / $n; print "domain versatility= $slope\n"; } } }

    And then call it like this:

    versatility( \%hash1, \%hash2 );

    (BTW: Do start adding some horizontal whitespace into your code. It makes it so much more readable. Maybe then people would recognise your subroutine as a subroutine :)


    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.
Re: two hashes in subroutin
by moritz (Cardinal) on Aug 18, 2011 at 10:18 UTC

    I don't see any subroutine in your code, so I don't know how it relates to your problem. Update: That's because I I can't read, but the advice stays the same.

    But judging from the text you'll likely need to pass the hashes as references. perlreftut teaches you how.

      hi mortiz, you always adress me to that page and i always read that but still i ahve problem.:-(

      this is my main script that i used this subroutine

      #!/usr/bin/perl -w use strict; my %genome1; my %genome2; my @files; my $file; #input first genome file name. print "Enter the first genome fasta file=\n"; my $filename=<>; #analyze the genome.getting domains,number of domains and their combin +ations. analyze_genome($filename); %genome1=n_nn(); for my $key (keys %genome1){ print "$genome1{$key}\n"; } #delet useless files. @files = ("domainlist","result","first"); for my $file (@files) { unlink $file or warn "Couldn't remove '$file': $!"; }; #input second genome file name. print"Enter the second genome fasta file=\n"; $filename=<>; analyze_genome($filename); %genome2=n_nn(); #delet usless files. @files = ("domainlist","result","first"); for my $file (@files) { unlink $file or warn "Couldn't remove '$file': $!"; }; #calculate domain versatility for each domain in the genomes. versatility(%genome1,%genome2); exit;