http://www.perlmonks.org?node_id=991037


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

Ah! Excellent, jemswira!! Here's what's happening... The regex trys to capture everything past " | " for use as a value. However, in the lines above, there are no values, so $2 is not initialized for those lines which creates errors. To fix this, change the grep to:

grep /\|\s+\S+/

You'll notice that the first part of the grep's regex is used in the map statement. The above adds \S+, which means that there need to be non-whitespace characters (i.e., values) beyond " | " for the line to pass. I'm assuming, here, that we can safely ignore lines that don't have anything past " | ". If this is the case, the above grep should resolve the errors.

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

    Thanks. That removed 2 of the error lines. The first 2. Now these are left:

    Use of uninitialized value $1 in hash element at C:\Users\Jems\Desktop +\Perl\test\test2script.plx line 26. Use of uninitialized value $1 in hash element at C:\Users\Jems\Desktop +\Perl\test\test2script.plx line 27. Use of uninitialized value $1 in hash element at C:\Users\Jems\Desktop +\Perl\test\test2script.plx line 28.

    lines 26, 27 and 28 are:

    for ( read_file $uniprot ) { /(.{6})\s+.+=([^\s]+)/; push @activline, "$1 | $2 | $activ{$1}\n" if $activ{$1}; #26 push @antioxline, "$1 | $2 | $antiox{$1}\n" if $antiox{$1}; #27 push @toxinline, "$1 | $2 | $toxin{$1}\n" if $toxin{$1};#28

    The format for $uniprot is the same as for $test. I.E.

    Q197F8 ORFNames=IIV3-002R Q197F7 ORFNames=IIV3-003L Q6GZX2 ORFNames=FV3-003R Q6GZX1 ORFNames=FV3-004R Q197F5 ORFNames=IIV3-005L Q6GZX0 ORFNames=FV3-005R ;PF02393 Q91G88 ORFNames=IIV6-006L ;PF12299;PF04383 Q6GZW9 ORFNames=FV3-006R

    Thanks again!

      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.

        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!