John, You are right, it's only reading the last record in my exclude_psc.txt file.
%ex_psc = (exclpsc=>$excpsc,exkeyword =>$keyword ); So how would i change the above code to have it read through all of my records in exclude_psc.txt file. I need to do the comparison below before printing to out file. Thanks. $newpsc = substr($PSC,0,$count); if (uc($ex_psc{exclpsc}) eq uc($newpsc)){ $_= join '|',$base_no,$ex_psc{exclpsc},$ex_psc{exkeyword}; print OUT; You are assigning to the hash so it will only contain data from the last record in the 'exclude_psc.txt' file. For more efficiency use File::ReadBackwards and only read one record. "John W. Krahn" <[EMAIL PROTECTED]> wrote: Bobby wrote: > Could someone please tell me what's wrong with my use of the > substr function below? I keep on getting "use of uninitialized > value in substr". Thanks. > > $newpsc = substr($PSC,0,$count); > > Here's the complete code: > > #!/usr/bin/perl > use strict; > use warnings; > > my $exclude_psc = 'exclude_psc.txt'; > my $current_base = 'base.txt'; > my $output = 'new_excludepsc.txt'; > my %ex_psc; > my $exkeyword; > > open EXCLUDE, '<', $exclude_psc or die "Could not open > '$exclude_psc' $!"; > > while ( ) { > next if $. == 1; # exclude header > chomp; > my ($excpsc,$keyword) = split /\|/; > > %ex_psc = (exclpsc=>$excpsc,exkeyword =>$keyword ); You are assigning to the hash so it will only contain data from the last record in the 'exclude_psc.txt' file. For more efficiency use File::ReadBackwards and only read one record. > } > close EXCLUDE; > > open BASE, '<', $current_base or die "Could not open '$current_base' > $!"; > open OUT, '>', $output or die "Could not open '$output' $!"; > > while () { > my ($base_no, $name, $description, $PSC) = split /\|/; > > my $newpsc; > my $wordlength; > > my $expsc=$ex_psc{exclpsc}; > my $count = $ex_psc{exclpsc}=~ s/([a-z])/$1/gi; You can do that more efficiently with tr///: my $count = $ex_psc{ exclpsc } =~ tr/a-zA-Z//; But since you are not (it would seem) changing the value of $ex_psc{ exclpsc } inside the loop why then are you calculating $count inside the loop? > if ($count eq 4){ You are using a string comparison operator on a number, better to use a numerical comparison operator: if ( $count == 4 ) { > $newpsc = substr($PSC,0,$count); Since 0 is a literal that means that you are getting the warning because either $PSC or $count has the value undef instead of a valid value. > if (uc($ex_psc{exclpsc}) eq uc($newpsc)){ > $_= join '|',$base_no,$ex_psc{exclpsc},$ex_psc{exkeyword}; > print OUT; > } > } > } > close(OUT); > __END__ John -- Perl isn't a toolbox, but a small machine shop where you can special-order certain sorts of tools at low cost and in short order. -- Larry Wall -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/ --------------------------------- Be a better friend, newshound, and know-it-all with Yahoo! Mobile. Try it now.