Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW

Re^9: Help with pushing into a hash

by Kenosis (Priest)
on Aug 31, 2012 at 16:59 UTC ( #991044=note: print w/replies, xml ) Need Help??

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

The message:

Use of uninitialized value $1...

Means that the regex is not matching some lines in your data set. Here are two options:

say if !/(.{6})\s+.+=([^\s]+)/;

This will show you the lines that are not matching, so you can adjust your regex, if needed.

next unless /(.{6})\s+.+=([^\s]+)/;

This will just skip those lines that don't match the regex.

Replies are listed 'Best First'.
Re^10: Help with pushing into a hash
by jemswira (Novice) on Aug 31, 2012 at 17:31 UTC

    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!

      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.

Log In?

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

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (10)
As of 2018-06-25 12:39 GMT
Find Nodes?
    Voting Booth?
    Should cpanminus be part of the standard Perl release?

    Results (126 votes). Check out past polls.