Anirban Adhikary wrote: > Dear List > I have write the The following code to check a file and print only distinct > lines to a new file and skips the duplicate lines. My source file is as > follows > > hello how are you? > hello how are you? > What language did you want to use? > What language did you want to use? > I am here > You are there > this is my first perl script > What language did you want to use? > > ############################################################################### > my code is as follows > > > #use strict; > #use warnings;
Never comment out these lines - they help enormously to find simple errors. > print "Enter the Absolutepath of the file\t"; > my $input=<STDIN>; > chomp($input); > > dup($input); > > sub dup > { > my $filename=shift; > my $count=0; > my @arr; > my $el; > my $element; - Variables should be declared as close as possible to their point of first use. - Try to use meaningful variable names; the @ in @arr means 'array' so you have something called "array arr". Also the difference between the function of $el and $element isn't clear from their names. > open(FH,"$filename"); > while(<FH>) - You must always check whether a file open succeeded. - $filename should stand on its own. Read the perlfaq article perldoc -q quoting entitled What's wrong with always quoting "$vars"? - The three-parameter form of open and lexical file handles are preferred, like this open my $fh, '<', $filename or die $!; while (<$fh>) { > { > chomp($_); > $element = $_; > if($count ==0) > { > push(@arr,$element); > $count+=1; > print "Count is $count\n"; $count isn't a count, as it is only incremented when it is zero and never used thereafter. You also don't need it at all, so you can remove this if statement altogether. > } > else > { > foreach $el(@arr) > { > my $len=$#arr; $len is the index of the last element of @arr, not its length. Use my $len = @arr; to get that. > chomp($el); The strings were chomped before they were added to @arr so there is no need to do it again. > # print "$element\n"; > #print "The length of arr is $len\n"; > if($el == $element) The == operator is for comparing numbers; to compare strings you must use eq. This is why your elsif block wasn't being executed: the values are being forced to numbers before they are compared, and since non-numeric strings evaluate as zero they were always numerically equal. If you had left warnings enabled you would have a message to tell you this. > { > print "\t######Inside If######\t\n"; > print $element."\n"; > next; > #push(@arr,$_); > } > > elsif($el != $element) There is no need to test again. If $el eq $element failed, then $el ne $element must succeed, and you need only an 'else' here. > { > push(@arr,$element); You shouldn't modify an array that you're currently iterating over, as the results aren't guaranteed and anything may happen. In other words, don't write foreach (@arr) { : push @arr, $val; : } > print "\t########Inside Elseif\n"; > #next; > } > } > } - The braces aren't paired properly in your program. I presume an extra one belongs here. - You test each new line again /every/ element in @arr, and push the line onto the array /every time/ it finds an array element that doesn't match. I assume you want to push the new line onto the array only if none of the elements match? Something like this perhaps while (my $element = <$fh>) { chomp $element; my $found; foreach my $el(@arr) { if ($el eq $element) { $found++; last; } } if (not $found) { print "$element\n"; push @arr,$element; } } > } > > ############################################################### > The problems I am facing are > > 1) The code is not getting entered into elsif block > > 2) I am comparing between 2 strings but if I use "eq" or "ne" for > comparison I am getting some horrible output so I am using numeric > comparison. > > 3)If I am giving print the $element variable outside foreach loop it is > getting printed but Inside foreach loop it is not showing anything. > > Can anybody Please suggest me where I am making the mistake? HTH, Rob -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/