Sumo Wrestler (or just ate too much) wrote:
>
> Try something like this:
>
> use strict;
> use Data::Dumper;
>
> $var = '
> iptables -A INPUT -p tcp -s 123.45.678.90 --dport 22 -j ACCEPT
>
> and ...
>
> iptables -A INPUT -p tcp --dport 25 -j ACCEPT
> ';
>
> open (FH, '<', \$var)
> or die ("Couldn't open in memory string: $!\n");
Why not just use __DATA__ and the DATA filehandle?
> # Important spaces have to be backslashed because I'm using
> # the /x option to make this regex readable.
> my $rx = q{
Why not just use qr{}x?
> (INPUT) # chain name
> \ -p\ (\w+) # protocol name
> \ (?:-s\ ([.\d]+))? # source ip optional (?)
> \ ? # extra space, optional (?)
> --dport\ (\d+) # destintation port
> \ -j\ (\w+) # target
> };
>
> my $expand = sub {
Why not just use a sub named 'expand' instead of a reference?
> my @fields = qw(chain proto sport dport target);
> my $fi = 0;
> my %hash = map +($fields[$fi++], $_), @_;
> return %hash;
Subroutines flatten their return values to a list so why not just return that
list instead of copying it to a hash first?
sub expand {
map { $_ => shift @_ } qw( chain proto sport dport target );
}
> };
>
> while (<FH>) {
> chomp;
Why chomp? The (\w+) at the end of the pattern is not going to capture the
newline.
> next unless m/^iptables/;
> s/\s+/ /g;
Why not just use \s+ in the pattern?
> if (m/$rx/ixo) {
You are using the /i option so that means that -p is the same as -P, -s is the
same as -S, -j is the same as -J and --dport is the same as --DPORT.
> my %hash = $expand->($1,$2,$3,$4,$5);
> print Dumper(\%hash);
> }
> }
>
> close (FH);
John
--
use Perl;
program
fulfillment
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>