ah I forgot the increment there (should have tried -s with multiple args before posting the code here, apologies for the sloppyness). thank you for noticing as well as providing this shorter and more elegant solution. I suspect there are multiple places where shift/join might be better than what I am doing, I'll check out the join documentation and see if it's a better fit. Thanks again. | [reply] |
Perhaps you should also look at using operators like push, for example in your code:
my (@commands,@matches,$ip);
for (my $i=0; $i < @temp; $i++){ #process each subset
if ($i == 0){
my @temp1 = split(/:/, $temp[0]); #this is the fir
+st subset, it contains the IP
$ip = $temp1[0];
$count++;
$temp[0] =~ s/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9
+][0-9]?)\.){3}(?:25[0-5]|2[0-4
+][0-9]|[01]?[0-9][0-9]?)://; #remove IP from subset
}
my @arr;
if ($temp[$i] =~ /\=/ ){ #this subset contains pattern
+-matching instructions
my @temp2 = split(/\=/, $temp[$i]); #split subset
+into further subsets, first co
+ntaining the command, the rest are patterns
$temp2[0] = substitute_placeholders($temp2[0],\@me
+tachars,\@translations); #all
+splitting is done on this string, revert it back to its original form
$commands[$i] = $temp2[0]; #this is the command
for (my $c=1; $c < @temp2; $c++){ #these are all t
+he patterns
$temp2[$c] = substitute_placeholders($temp2[$c
+],\@metachars,\@translations);
+ ##undo prior substitutions
$arr[$c] = $temp2[$c];
}
$matches[$i] = \@arr;
}else{ #this subset does not contain pattern matching
+instructions
$temp[$i] = substitute_placeholders($temp[$i],\@me
+tachars,\@translations); ##und
+o prior substitutions
$commands[$i] = $temp[$i];
$arr[$i] = "no-match-hook"; ##set flag for easy id
+entification later on in the s
+cript
$matches[$i] = \@arr;
}
}
$$DATA{$ip}->{commands} = \@commands;
$$DATA{$ip}->{matches} = \@matches;
It looks like you could use push instead of array indexes. Something like this:
my ( @commands, @matches, $ip );
for my $i ( 0 .. $#temp ) { #process each subset
if ( $i == 0 ) {
my @temp1 = split /:/, $temp[ 0 ]; #this is the fi
+rst subset, it contains the IP
$ip = $temp1[ 0 ];
$count++;
$temp[ 0 ] =~ s/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0
+-9][0-9]?)\.){3}(?:25[0-5]|2[0-4
+][0-9]|[01]?[0-9][0-9]?)://; #remove IP from subset
}
my @arr;
if ( $temp[ $i ] =~ /=/ ) { #this subset contains patt
+ern-matching instructions
my @temp2 = split /=/, $temp[ $i ]; #split subset
+into further subsets, first co
+ntaining the command, the rest are patterns
push @commands, substitute_placeholders( $temp2[ 0
+ ], \@metachars, \@translations ); #all
+splitting is done on this string, revert it back to its original form
for my $c ( 1 .. $#temp2 ) { #these are all the pa
+tterns
push @arr, substitute_placeholders( $temp2[ $c
+ ], \@metachars, \@translations );
+ ##undo prior substitutions
}
push @matches, \@arr;
} else { #this subset does not contain pattern matchin
+g instructions
push @commands, substitute_placeholders( $temp[ $i
+ ], \@metachars, \@translations ); ##und
+o prior substitutions
push @arr, "no-match-hook"; ##set flag for easy id
+entification later on in the s
+cript
push @matches, \@arr;
}
}
$$DATA->{ $ip }{ commands } = \@commands;
$$DATA->{ $ip }{ matches } = \@matches;
| [reply] [d/l] [select] |
I thought about using push and foreach instead of all the indexing, counting and such, but decided against it, because I wasn't sure it would work.
The reason being that I need 100% certainty that the command=match relationship is deducable from the data structure, in all of the following cases:
- command X and NO matches
- command X and match y
- command X and match y + ...match n
if I use push in all cases won't this logic collapse?
or maybe I just have to push undef, if that's possible. Again, Thank you for taking the time.
| [reply] |