Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical

Re^10: Help with pushing into a hash

by jemswira (Novice)
on Aug 31, 2012 at 17:31 UTC ( #991049=note: print w/replies, xml ) Need Help??

in reply to Re^9: Help with pushing into a hash
in thread Help with pushing into a hash

Well the file's format was wrong at some parts. So yeah, that. I'll go see if I can fix the file. Thanks so much again!

Replies are listed 'Best First'.
Re^11: Help with pushing into a hash
by Kenosis (Priest) on Aug 31, 2012 at 17:40 UTC

    You're very welcome! Return if you encounter more issues...

      Hey there kenosis. Sorry to bother you again. SO the program is no longer giving me error messages, but the pushing to the arrays here:

      push @activline, "$1 | $2 | $activ{$1} \n" if $activ{$1}; push @antioxline, "$1 | $2 | $antiox{$1} \n" if $antiox{$1}; push @toxinline, "$1 | $2 | $toxin{$1} \n" if $toxin{$1};

      isn't working properly. For example I selected a specific number from $activin, which was in $uniprot, but it wasn't in the final output. So @activline, @antioxline and @toxinline are much smaller than they should be. So a lot of the data that is supposed to be in the output is not there anymore. I tried testing with this:

      if ($1 eq "E7F888"){print $2;}

      and it gave me the correct $2, I tried this too:

      next unless /(E7F888)\s+.+=([^\s]+)/; push @activline, "$1 | $2 | $activ{$1} \n" if $activ{$1}; print @activline;

      and it printed the correct thing. But if I removed the tests i put, and ran the normal code, E7F888 is not in @activline. Is there anything I could do to figure out what's wrong with my code? Here's it again.

      #!/usr/bin/perl use Modern::Perl; use File::Slurp qw/read_file write_file/; my $uniprot = 'uniprot-ACN'; my $activin = 'Activator-PFAM.txt'; my $antioxin = 'AntiOxidant-PFAM.txt'; my $toxinin= 'Toxin-PFAM.txt'; my $activout = 'ActivACNPF.txt'; my $antioxout= 'AntioxACNPF.txt'; my $toxinout= 'ToxinACNPF.txt'; my @activline; my @antioxline; my @toxinline; my %activ = map {s/\.\d+//g; /(.+)\s+\|\s+(.+)/ and $1 => $2 } grep / +\|\s+\S+/, read_file $activin; my %antiox = map { s/\.\d+//g; /(.+)\s+\|\s+(.+)/ and $1=>$2; } grep/\ +|\s+\S+/,read_file $antioxin; my %toxin = map { s/\.\d+//g; /(.+)\s+\|\s+(.+)/ and $1=>$2; } grep/\ +|\s+\S+/,read_file $toxinin; #if (exists $activ{"E7F888"}) { #print $activ{'E7F888'};} #else {print "LOL";} for ( read_file $uniprot ) { next unless /(.{6})\s+.+=([^\s]+)/; # if ($1 eq "E7F888"){print $2;} push @activline, "$1 | $2 | $activ{$1} \n" if $activ{$1}; push @antioxline, "$1 | $2 | $antiox{$1} \n" if $antiox{$1}; push @toxinline, "$1 | $2 | $toxin{$1} \n" if $toxin{$1}; } print @activline; write_file $activout, @activline; write_file $antioxout, @antioxline; write_file $toxinout, @toxinline;

      THanks so much.

        Hi, jemswira!

        This is no bother at all!

        You mentioned that the following captured a key that wasn't in the final set:

        next unless /(E7F888)\s+.+=([^\s]+)/; push @activline, "$1 | $2 | $activ{$1} \n" if $activ{$1}; print @activline;

        Try the following:

        next unless /(E7F888)\s+.+=([^\s]+)/; say; exit;

        saywill print the scalar $_ which the regex operates on. By doing this, you can examine the line to verify that the matches the following regex:


        Also, it may be that the 'key' is not being captured from $activin, since:

        push @activline, "$1 | $2 | $activ{$1} \n" if $activ{$1};

        will work only if the 'key' if found in both files and the regexs which process both work as they should.

        Let me know what you find...

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://991049]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (5)
As of 2018-06-22 00:00 GMT
Find Nodes?
    Voting Booth?
    Should cpanminus be part of the standard Perl release?

    Results (120 votes). Check out past polls.