Harry Putnam <[EMAIL PROTECTED]> wrote: : : "Charles K. Clarkson" <[EMAIL PROTECTED]> writes: : : > : I wanted a way to ensure that each reg has hit at : > : least once. Otherwise we don't print. So I used a : > : formulation like this (Not posted previously for : > : clarity): : > : : > : if ($data{$hdregs[$ii]}++ == 0) { : > : ## it will only be 0 once : > : $hdelem_hit_cnt++; : > : } : > : Then before printing we compare $hdelem_hit_cnt to : > : ($#hdregs + 1): : > : : > : sub test_hdr_good { : > : if ($hdelem_hit_cnt == ($#hdregs + 1)) { : > : $test_hdr_good = "TRUE"; : > : $hdelem_hit_cnt = 0; : > : > Generally, global variables should raise a giant, : > blinking, annoying sign telling us we an are no : > longer in Kansas. : : I didn't post it but in fact I have a `my' declaration : like this at the beginning of my `sub wanted {' : : my($line,@hdhits,$hdelem_hit_cnt,%data); : : Another one at the beginning of the script that trys : to catch everthing that didn't need to be local to a : loop of some kind.
As programs get larger, many perl programmers find declaring variables at the top of a code structure a poor idea. In perl it is generally better to declare a variable at or very near it's first invocation. I realize you wanted to keep your message brief and I applaud your efforts, but (IMO) you left out relevant parts of test_hdr_good(). It looks like $test_hdr_good and $hdelem_hit_cnt are globals declared /outside/ the sub. If that is not the case you should have included that part of the sub. If it is the case, (unless $test_hdr_good, @hdregs, and $hdelem_hit_cnt are local to an unnamed block containing related subs, which doesn't seem the case) you are using global variables. : > : They should be the same if all regs have hit at least : > : once. If not the same... we don't print. : > : > Actually, they should be the same if all regs were : > hit /only/ once. : : No, you'd have to try it to see that is not true. : : That was the beauty of it to me. It would only increment : if a UNIQ hit happened but not if other repeated hits : happened. So a repeat hit would not get mistaken for a : UNIQUE hit and throw off the count. Later in the test_hdr_good() sub we this comparison: if ($hdelem_hit_cnt == ($#hdregs + 1)) { (Assuming $hdelem_hit_cnt and @hdregs are global): To be true $hdelem_hit_cnt has to have the same value as the number of elements in @hdregs. Since $hdelem_hit_cnt won't increment if it finds a duplicate in @hdregs all of @hdregs elements must be unique unless something unseen is working on %data, $hdelem_hit_cnt, or @hdregs. HTH, Charles K. Clarkson -- Mobile Homes Specialist 254 968-8328 -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>