Lance Murray wrote: > > Hello: Hello,
> I've been away from the Learning Perl book for a few weeks and trying to refresh > my memory, but I'm stumped. What I need to do is take the output of a command > (ovfiltercheck) that looks something like this: > > ### BIN OUTPUT BEGIN ##################### > FilterExpressions { > NetBackbone "Networks and gateways/routers" { (Routers || Networks) } > blah, blah, > } > > Defined Filter List > =========== > ATMnodes > Bridges > Segments > > Defined Set List > ================ > FAILOVER_SET > WHWAN_INFRA_NODES > ### BIN OUTPUT END ######################## > > and get it into an array (i.e @filters) that looks like this: > ### @filters BEGIN ######################## > ATMnodes > Bridges > Segments > ### @filters END ########################## > > My question is whethor or not its better to parse the data as I load the array > from the program output, or parse the array after the fact, or parse the array > after the fact multiple times In either case I seem to get lost in trying to > use a foreach and shift at the same time, e.g.: > > #### TRYING TO PARSE PURGE EVERYTHING TO "Defined Filter List" +two elements) > my @filters = `/opt/OV/bin/ovfiltercheck`; > foreach ( @filters ) { > if ( m/Defined Filter List/ ) { # IF FIND FILTER SECTION > shift; # DELETE "Defined Filter List" shift with no arguments removes elements from the array @ARGV in the main program or from the array @_ in a subroutine so it is having no effect on the array @filters. But you shouldn't modify an array in a foreach loop anyways. > shift; # DELETE "================" > last; # EXIT FOREACH LOOP > } else { > shift; # DELETE ELEMENTS > } > } > # Make another foreach loop to dump elements after "Defined Set List" > print @filters; > > In my mind, I'm thinking from DB perspective where I'm deleting the current > record, not just the element at the start (shift) or end of an array (push). Is > there any way to dump an element anywhere? (e.g., pop $array[$anyElement] or > shift $anyElement[5]) > > ### ANOTHER PATHETIC ATTEMPT > my ( @filters, $filters_begin, $filters_end) ; > open OVFILTERCHECK, "/opt/OV/bin/ovfiltercheck |" || die "Error, can't open: $!\n"; ^^ The '||' operator's precedence is too high for this to work properly. You need to use the low precedence 'or' operator or use parenthesis to set the correct precedence. > while (<OVFILTERCHECK>) { > if ( m/Defined Filter List/ ) { # WHEN I GET TO THE FILTER LIST > $filters_begin = 1; # SET A FLAG INDICATING SAME > } > if ( m/Defined Set List/ ) { # WHEN PASS THE FILTER SECTION > last; # TERMINATE ARRAY LOADING > } > if ($filters_found) { # IF FILTER SECTION HAS BEGUN > $filters[$.++] = $_; # SAVE VALID FILTER NAMES TO @FILTERS > } > print @filters; > > Sorry for the crappy psuedocode that shows I don't have a clue. Its been a long > day and my brain feels like its fried. All I want to do is "cut" (save to an > array) the text between the words "Defined Filter List\n================" and > "\nDefined Set List". Any help would be appreciated and a true solution worth a > Six Dollar burger & movie via PayPal (in other words, I'll pay out of pocket). Here is one way to do it: my ($output) = `/opt/OV/bin/ovfiltercheck` =~ /^Defined Filter List\n=+\n(.+?)\n\n/ms; my @filters = split /\n/, $output; print @filters; Another way to do it: my $prog = '/opt/OV/bin/ovfiltercheck'; open PIPE, "$prog |" or die "Cannot open pipe to $prog: $!"; my @filters; while ( <PIPE> ) { next if 1 .. /^Defined Filter List/; last if /^\s*$/; chomp; push @filters, $_ unless /^=+$/; } close PIPE or die "Cannot close pipe to $prog: $!"; print @filters; John -- use Perl; program fulfillment -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]