in reply to Two hash keys created when '.' is in the string

The line:
$uniques{"$2.cfm"}++;

Increments the value stored under hash key "$2.cfm". If you haven't set it to anything, it'll end up with a value of 1 (0 + 1 = 1) :)

You then set the value of hash key "$2" to '<cust>'.

In your modified version, the line:

$uniques{"$2"}++;
Is redundant, since you're overwriting the value on the next line. I think you're looking for something like this:
while ($_ =~ /(<cf_)(.*?)[>\s]/gi) { # finding custom tags $uniques{$2}++; }

Then you can print out a list of how many times each custom tag is being called with something like this:

while (my ($code, $count) = each %uniques) { print "$code => $count\n"; }
Or, do whatever else you want with the results...

Replies are listed 'Best First'.
Re^2: Two hash keys created when '.' is in the string
by yacoubean (Scribe) on Nov 24, 2004 at 18:16 UTC
    Oh! Now I feel dumb. See, the second line is there because I need to flag the value as a custom tag, because I am also returning href=, action=, and other 'links'. But I was being really dumb, not realizing that I was creating 2 different keys, one named '$2.cfm' and the other '$2'. <smacks head in disbelief> :)
    If you're curious, here's one of my other sections that worked correctly:
    while ($_ =~ /(href)[ ="']+(.*?)["'>|\?]/gi) { # finding linked files if (($2 =~ /css/i)|($2 eq $cfm)) { # skipping css files and links t +o self } else { $uniques{"$2"}++; $uniques{$2} = "<norm>"; } }
      I doubt that actually is working. A few problems:
      • You shouldn't ever need to use "$2". It's just the same thing as $2.
      • So you're still assigning two values to the same hash key. The second one overwrites the first, so that $uniques{"$2"}++; line does nothing.
      • Also, | is the bitwise or operator. You want || or or.
      • And finally, running any regexp match overwrites the values of all the number variables (for instance, $2), so after checking $2 =~ /css/i, $2 will be undef.

        "And finally, running any regexp match overwrites the values of all the number variables (for instance, $2), so after checking $2 =~ /css/i, $2 will be undef."

        Not true. Perl doesn't garuntee that it will overright those unless they actualy match. Since that regex isn't doing any captures he should be safe, not that I think its the best way to do it, but its safe.


        ___________
        Eric Hodges
        You shouldn't ever need to use "$2". It's just the same thing as $2.
        Not always. Given: sub foo { $^O=~/((.*))/; print for @_ } (a sub that happens to use a regex before accessing its args), foo("$2") if "foobar"=~/(...)(...)/ does something very different from foo($2) if "foobar"=~/(...)(...)/ You should always put magic variables in quotes when passing to a function to prevent this kind of action-at-a-distance.

        Another case where you need to double-quote a variable is when using the string bitwise operators on something that happens to have a cached numeric value:

        $ perl -le'$x = "41"; 0+$x; print for ("$x" ^ "3"), ($x ^ "3")' 1 42
        (Do the noises in my head bother you?)