k2 has asked for the wisdom of the Perl Monks concerning the following question:

Hello!
Does anyone know why I end up with an error-message when I run the following???
if ($if_name eq $outside_if && $if_dir eq 'inbound') { if (my $service eq 'mail') { my $smtp_inc_src_cnt{$src} ++; my $smtp_inc_dst_cnt{$dst} ++; my $smtp_inc_tot ++; } }

This is the error-message I get:
syntax error at D:\perltmp\statpdf2.pl line 49, near "$smtp_inc_src_cn +t{" syntax error at D:\perltmp\statpdf2.pl line 49, near "++;" syntax error at D:\perltmp\statpdf2.pl line 50, near "$smtp_inc_dst_cn +t{" syntax error at D:\perltmp\statpdf2.pl line 50, near "++;" syntax error at D:\perltmp\statpdf2.pl line 54, near "}"
The code is run under use strict...

TIA
k2

Replies are listed 'Best First'.
Re: Autoincrement errors...
by VSarkiss (Monsignor) on Dec 02, 2001 at 02:56 UTC

    You can't my a single hash element. Declare the entire hash once, outside the loop. Move the declaration for $smtp_inc_tot outside the loop as well. Something like this:

    my (%smtp_inc_src_cnt, %smtp_inc_dst_cnt, $stmp_inc_tot); if ($if_name eq $outside_if && $if_dir eq 'inbound') { if (my $service eq 'mail') { $smtp_inc_src_cnt{$src} ++; $smtp_inc_dst_cnt{$dst} ++; $smtp_inc_tot ++; } }
    For more information, you may want to check out Coping with Scoping by our own Dominus.

    HTH

Re: Autoincrement errors...
by Chmrr (Vicar) on Dec 02, 2001 at 02:57 UTC

    A few comments on your code; firstly, the line if (my $service eq 'mail') has me confused. You're making a new variable named $service and then immediatly checking if it's equal to 'mail'. Being a new variable, however, its value is undef still. Perhaps you got overzealous with the mys?

    Lastly, we come to the lines which are actually raizing your error. $smtp_inc_src_cnt{$src} is just one element of a hash -- which, if you think about it, would be rather hard to make a new variable of (what happens if you've already defined the rest of the hash elsewhere?) Perhaps you meant:

    my %smtp_inc_src_cnt = (src => 1); my %smtp_inc_dst_cnt = (dst => 1); my $smtp_inc_tot = 1;

    But even that doesn't do what you want -- the hashes and scalar would be only defined within your innermost if statement. So both of them should probably be moved to outside you loop, like so:

    my (%smtp_inc_src_cnt, %smtp_inc_dst_cnt,$smtp_inc_tot); if ($if_name eq $outside_if && $if_dir eq 'inbound') { if ($service eq 'mail') { $smtp_inc_src_cnt{$src}++; $smtp_inc_dst_cnt{$dst}++; $smtp_inc_tot++; } }

    Update: *sigh* -- never node just after waking up. Messing up precedence is something I hardly ever do. Grump. Kudos to chipmunk for poking me.

    perl -pe '"I lo*`+$^X$\"$]!$/"=~m%(.*)%s;$_=$1;y^+*`^ ve^#$&V"+@( NO CARRIER'

Re: Autoincrement errors...
by k2 (Scribe) on Dec 02, 2001 at 14:32 UTC
    Thanks alot VSarkiss!
    Sure I missed declaring %smtp_inc_tot...
    Just couldn't see it yesterday...

    Regarding the my $service problem that Chmrr mentioned
    I actually have declared this variable earlier in my code
    (this is not all of the code, just the part causing
    problem) but I still got an error on that variable
    saying that it was a global variable
    and putting my infront solved that.
    Haven't thought to much about that.

    Thanks alot for helping me out here!!
    It's hard to see your misstakes when you have been staring
    at a pice of code for a couple of hours...

    /k2