in reply to Help - Counting text - Associative Array?

Ugh. You didn't say if the values appear on the lines of the file by themselves, or if they are contained inside a larger string.

Also, you want to count several things, but you have your count as a single scalar value. That's not going to work.

If the values appear alone, you could do something like

while (<FILE>) { chomp; foreach $key (keys %exe) { $count{$_}++ if ($_ eq $key); } } foreach $key (keys %exe) { print "Name:$key\t Count:$count{$key}\n"; }
Note that I've made count into a hash with the same keys as %exe, and that I've exchanged == (numeric equality) with eq (string equality).

If the strings you're looking for aren't the only thing in each line you read, you'd better use index or a regex to find them - string comparison won't work.

Replies are listed 'Best First'.
Re: Re: Help - Counting text - Associative Array?
by Mr_Lowry (Initiate) on Mar 19, 2004 at 20:32 UTC
    Ok I tried your code and of course you are right. I changed it so it will return the count of THE VALUES of the array in the file, but the strings have to be on their own lines (as you said). Since the string we're using is the VALUE, it prints the VALUE not the KEY at the end.

    I guess I will have to research regex and see what I can do. Just for grins I've attached the code and result. To test it I had to create a file with the exe strings on their own lines.

    Thanks again for the help.

    Code:

    open (FILE, "security2.txt"); print "\n"; %exe = ( "Catalog", 'C:\Program Files\Internet Explorer\IEXPLORE.EXE', + "Crime", 'D:\crime\Reader\AcroRd32.exe'); while (<FILE>) { chomp; foreach $value (values %exe) { $count{$_}++ if ($_ eq $value); } } foreach $value (values %exe) { print "Name:$value\t Count:$count{$value}\n"; } close(FILE);

    Result:

    Name: C:\Program Files\Internet Explorer\IEXPLORE.EXE Count: 2 Name: D:\crime\Reader\AcroRd32.exe Count: 1