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

Hello,

This is my first stab at writing a Perl script and could use another set of eyes. My current script is below and the error message I am getting.

Basically I am trying to get all the txt files from a directory, read through each file line by line, and then separate the records into separate files. Each record is pipe delimited with 13 items in each record. Separation of the records is determined by the value of the first three characters of the 8th item in each record.

Error Messages:

Use of uninitialized value $var8 in substr at test.pl line 24, <IN> li +ne 2. Use of uninitialized value $var8 in substr at test.pl line 24, <IN> li +ne 17. ksh: IN: cannot open server: Use of uninitialized value $var8 in substr at test.pl line 24, + <IN> line 3. ksh: IN: cannot open servername: Use of uninitialized value $var8 in substr at test.pl line + 24, <IN> line 4. ksh: IN: cannot open servername: Use of uninitialized value $var8 in substr at test.pl line + 24, <IN> line 5. ksh: IN: cannot open servername: Use of uninitialized value $var8 in substr at test.pl line + 24, <IN> line 6. ksh: IN: cannot open servername: Use of uninitialized value $var8 in substr at test.pl line + 24, <IN> line 7. ksh: IN: cannot open servername: Use of uninitialized value $var8 in substr at test.pl line + 24, <IN> line 8. ksh: IN: cannot open servername: Use of uninitialized value $var8 in substr at test.pl line + 24, <IN> line 9. ksh: IN: cannot open servername: Use of uninitialized value $var8 in substr at test.pl line + 24, <IN> line 10. ksh: IN: cannot open servername: Use of uninitialized value $var8 in substr at test.pl line + 24, <IN> line 11. ksh: IN: cannot open servername: Use of uninitialized value $var8 in substr at test.pl line + 24, <IN> line 12. ksh: IN: cannot open servername: Use of uninitialized value $var8 in substr at test.pl line + 24, <IN> line 19. Use of uninitialized value $var8 in substr at test.pl line 24, <IN> li +ne 20. Use of uninitialized value $var8 in substr at test.pl line 24, <IN> li +ne 21. <br><br>
Script:

#!/usr/bin/perl -w @files = </myhome/incoming/*.txt>; foreach $file (@files) { print $file . "\n"; open(IN,$file) || die ("Could not open file"); open(OUT131,'>>/myhome/outgoing/data131.txt'); open(OUT186,'>>/myhome/outgoing/data186.txt'); open(OUT999,'>>/myhome/outgoing/data999.txt'); while (<IN> ne "") { my $line = IN; chomp($line); my $firstchar = substr($line,0,1); if($firstchar eq "#") { next; } my ($var1,$var2,$var3,$var4,$var5,$var6,$var7,$var8,$var9,$var10 +,$var11,$var12,$var13)=split(/\|/, $line); #variables are separated b +y commas. my $type = substr($var8,0,3); if($type eq 131) { print OUT131 $line . "\n"; } elsif($type eq 186) { print OUT186 $line . "\n"; } else { print OUT999 $line . "\n"; } } close(IN); close(OUT131); close(OUT186); close(OUT999); my $newfile='/roamdev/htdocs/RIEFID/incoming/processed/new_file.txt +'; #use File::Copy; #move($file, $newfile) or die "The move operation failed: $!"; } exit 0;
Could use some assistance getting past this error. Thanks ahead of time!

Replies are listed 'Best First'.
Re: New to Perl - Script Error
by toolic (Bishop) on Jul 21, 2011 at 16:26 UTC
    Use of uninitialized value $var8 in substr at test.pl line 24, <IN> line 2.
    That warning message means that you have split a line of your input file which has fewer than 7 pipe characters.

    You could change:

    my ( $var1, $var2, $var3, $var4, $var5, $var6, $var7, $var8, +$var9, $var10, $var11, $var12, $var13 ) = split( /\|/, $line ); #v +ariables are separated by commas. my $type = substr( $var8, 0, 3 );
    to:
    my @vars = split( /\|/, $line ); if (@vars > 7) { my $type = substr( $vars[7], 0, 3); # do something }

    You should also wrap your error/warning messages inside "code" tags.

    Update:

    if($type eq 131) {
    should be:
    if($type eq '131') {
    or:
    if($type == 131) {

      I hope I am using this forum properly. Im not seeing my responses to you in the thread.

      Here are my next warning messages:

      perl test.pl /myfolder/incoming/RIE.06242011.txt Use of uninitialized value $line in scalar chomp at test.pl line 17, < +IN> line 1. Use of uninitialized value $line in substr at test.pl line 19, <IN> li +ne 1. Use of uninitialized value $line in split at test.pl line 25, <IN> lin +e 1. Use of uninitialized value $line in scalar chomp at test.pl line 17, < +IN> line 2. Use of uninitialized value $line in substr at test.pl line 19, <IN> li +ne 2. Use of uninitialized value $line in split at test.pl line 25, <IN> lin +e 2. Use of uninitialized value $line in scalar chomp at test.pl line 17, < +IN> line 3. Use of uninitialized value $line in substr at test.pl line 19, <IN> li +ne 3. Use of uninitialized value $line in split at test.pl line 25, <IN> lin +e 3. Use of uninitialized value $line in scalar chomp at test.pl line 17, < +IN> line 4. Use of uninitialized value $line in substr at test.pl line 19, <IN> li +ne 4. Use of uninitialized value $line in split at test.pl line 25, <IN> lin +e 4. Use of uninitialized value $line in scalar chomp at test.pl line 17, < +IN> line 5. Use of uninitialized value $line in substr at test.pl line 19, <IN> li +ne 5. Use of uninitialized value $line in split at test.pl line 25, <IN> lin +e 5. Use of uninitialized value $line in scalar chomp at test.pl line 17, < +IN> line 6. Use of uninitialized value $line in substr at test.pl line 19, <IN> li +ne 6. Use of uninitialized value $line in split at test.pl line 25, <IN> lin +e 6. Use of uninitialized value $line in scalar chomp at test.pl line 17, < +IN> line 7. Use of uninitialized value $line in substr at test.pl line 19, <IN> li +ne 7. Use of uninitialized value $line in split at test.pl line 25, <IN> lin +e 7. Use of uninitialized value $line in scalar chomp at test.pl line 17, < +IN> line 8. Use of uninitialized value $line in substr at test.pl line 19, <IN> li +ne 8. Use of uninitialized value $line in split at test.pl line 25, <IN> lin +e 8. Use of uninitialized value $line in scalar chomp at test.pl line 17, < +IN> line 9. Use of uninitialized value $line in substr at test.pl line 19, <IN> li +ne 9. Use of uninitialized value $line in split at test.pl line 25, <IN> lin +e 9. Use of uninitialized value $line in scalar chomp at test.pl line 17, < +IN> line 10. Use of uninitialized value $line in substr at test.pl line 19, <IN> li +ne 10. Use of uninitialized value $line in split at test.pl line 25, <IN> lin +e 10. Use of uninitialized value $line in scalar chomp at test.pl line 17, < +IN> line 11. Use of uninitialized value $line in substr at test.pl line 19, <IN> li +ne 11. Use of uninitialized value $line in split at test.pl line 25, <IN> lin +e 11. Use of uninitialized value $line in scalar chomp at test.pl line 17, < +IN> line 12. Use of uninitialized value $line in substr at test.pl line 19, <IN> li +ne 12. Use of uninitialized value $line in split at test.pl line 25, <IN> lin +e 12. Use of uninitialized value $line in scalar chomp at test.pl line 17, < +IN> line 13. Use of uninitialized value $line in substr at test.pl line 19, <IN> li +ne 13. Use of uninitialized value $line in split at test.pl line 25, <IN> lin +e 13. Use of uninitialized value $line in scalar chomp at test.pl line 17, < +IN> line 14. Use of uninitialized value $line in substr at test.pl line 19, <IN> li +ne 14. Use of uninitialized value $line in split at test.pl line 25, <IN> lin +e 14. Use of uninitialized value $line in scalar chomp at test.pl line 17, < +IN> line 15. Use of uninitialized value $line in substr at test.pl line 19, <IN> li +ne 15. Use of uninitialized value $line in split at test.pl line 25, <IN> lin +e 15. Use of uninitialized value $line in scalar chomp at test.pl line 17, < +IN> line 16. Use of uninitialized value $line in substr at test.pl line 19, <IN> li +ne 16. Use of uninitialized value $line in split at test.pl line 25, <IN> lin +e 16. Use of uninitialized value $line in scalar chomp at test.pl line 17, < +IN> line 17. Use of uninitialized value $line in substr at test.pl line 19, <IN> li +ne 17. Use of uninitialized value $line in split at test.pl line 25, <IN> lin +e 17. Use of uninitialized value $line in scalar chomp at test.pl line 17, < +IN> line 18. Use of uninitialized value $line in substr at test.pl line 19, <IN> li +ne 18. Use of uninitialized value $line in split at test.pl line 25, <IN> lin +e 18. Use of uninitialized value $line in scalar chomp at test.pl line 17, < +IN> line 19. Use of uninitialized value $line in substr at test.pl line 19, <IN> li +ne 19. Use of uninitialized value $line in split at test.pl line 25, <IN> lin +e 19. Use of uninitialized value $line in scalar chomp at test.pl line 17, < +IN> line 20. Use of uninitialized value $line in substr at test.pl line 19, <IN> li +ne 20. Use of uninitialized value $line in split at test.pl line 25, <IN> lin +e 20. Use of uninitialized value $line in scalar chomp at test.pl line 17, < +IN> line 21. Use of uninitialized value $line in substr at test.pl line 19, <IN> li +ne 21. Use of uninitialized value $line in split at test.pl line 25, <IN> lin +e 21. Use of uninitialized value $line in scalar chomp at test.pl line 17, < +IN> line 22. Use of uninitialized value $line in substr at test.pl line 19, <IN> li +ne 22. Use of uninitialized value $line in split at test.pl line 25, <IN> lin +e 22.
      Script
      #!/usr/bin/perl -w @files = </myserver/incoming/*.txt>; foreach $file (@files) { print $file . "\n"; #last unless defined $file; open(IN,$file) || die ("Could not open file"); open(OUT131,'>>/myserver/outgoing/data131.txt'); open(OUT186,'>>/myserver/outgoing/data186.txt'); open(OUT999,'>>/myserver/outgoing/data999.txt'); while (<IN> ne "") { my $line = $_; chomp($line); my $firstchar = substr($line,0,1); if($firstchar eq "#") { next; } my @vars1 = split( /\|/, $line ); if (@vars > 7) { my $type = substr( $vars[7], 0, 3); if($type eq "131") { print OUT131 $line . "\n"; } elsif($type eq "186") { print OUT186 $line . "\n"; } else { print OUT999 $line . "\n"; } } } close(IN); close(OUT131); close(OUT186); close(OUT999); my $newfile='/myserver/incoming/processed/new_file.txt'; #rename $file, $newfile; #use File::Copy; #move($file, $newfile) or die "The move operation failed: $!"; } exit 0;

        while (<IN> ne "") { my $line = $_; chomp($line);
        Try:
        while (my $line = <IN>) { chomp($line);