develooper Front page | perl.beginners | Postings from March 2002

RE: Can I do this with perl?

Thread Previous | Thread Next
Chas Owens
March 4, 2002 08:08
RE: Can I do this with perl?
Message ID:
A quick dissection of what is going on here:

On Mon, 2002-03-04 at 10:20, Nikola Janceski wrote:
> Yes you can do it with perl, and I suggest using hashes.
> open(FILE, "$file");

This opens a file and associates it with FILE; you really should say
something like 'or die "Could not open $file:$!"' to make sure the file

> my %seen;

Creates a hash variable named %seen;

> while(<FILE>){

This loops while there are still lines left to read from FILE.  I would
have used just the <> operator to read from either the stdin or files
named on the command line and ditched the open above, but that is just a
style issue.

> 	my ($item9, $item10) = (split /\|/, $_)[8,9];

This line is fairly complicated.  First we are splitting the line read
by the while above into a list using the '|' character as the
separator.  Then taking an array slice (a method of returning only a
subset of an array) that contains the ninth and tenth fields (remember
Perl uses zero based arrays).  Finally we are storing field nine into
$item9 and field ten into $item10.  

> 	if(exists $seen{$item9}){

This bit of code checks to see if we have seen $item9 before by checking
to see if it exists in the hash %seen.  This would normally  be
shortened to "if ($seen{$item9}) {" since the value associated with any
key not stored in the hash is undef by default and undef is equivalent
to false, but we are storing field ten in it later and field ten can be
0 (which is also false).

> 		if($itme10 > $seen{$item9}){
> 			# the new $item10 is larger than the last one seen

You would want to say 'print $_;' (or possibly jsut 'print;' since print
uses the default variable, $_, when there are no other arguments) here
to print the record.

> 			} else {
> 			# the contrary is true
> 			}
> 		} else {
> 		$seen{$item9} = $itme10;

Here we are setting the value of the key $item9 to the value $item10 in
the hash named %seen.  This is also where you would want to print the
record since it is the first time we have seen $item9.  See above for
how to do that.

> 		}
> close FILE;

This closes the file associated with FILE.  It is not completely
necessary since perl will close all open file handles on exit, but I
think it is good practice. 

> -----Original Message-----
> From: Dave Adams []
> Sent: Monday, March 04, 2002 10:10 AM
> To:
> Subject: Can I do this with perl?
> Hi there,
> I have a problem which I would like to use perl to resolve, however I'm not
> sure if it is possible to do. 
> I need to scan a file and check some conditions, first if field 9 is
> duplicated on 1 or more rows, then I need to check field 10 to see which is
> the greater value and then only print the whole row where field 10 is the
> greater, if field 9 is not a duplicate then print the whole row.
> An example of the data is below.
> 28525|U2|4CY0|50|6775.15|2002-02-07|10461|321.43|102040724|102040773|
> 28526|U2|4CY0|25|3571.78|2002-02-07|6107|167.74|102040774|102040798|
> 28527|U2|4CY0|50|6930.3|2002-02-07|11376|324.12|102040774|102040823|
> 28528|U2|4CY0|25|4640.28|2002-02-07|4800|217.43|102040824|102040848|
> 28529|U2|4CY0|50|8432.05|2002-02-07|9023|392.03|102040824|102040873|
> Dave
> ----------------------------------------------------------------------------
> --------------------
> The views and opinions expressed in this email message are the sender's
> own, and do not necessarily represent the views and opinions of Summit
> Systems Inc.
> -- 
> To unsubscribe, e-mail:
> For additional commands, e-mail:
Today is Pungenday the 63rd day of Chaos in the YOLD 3168
You are what you see.

Missile Address: 33:48:3.521N  84:23:34.786W

Thread Previous | Thread Next Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at | Group listing | About