Employing Basic debugging checklist/brian's Guide to Solving Any Perl Problem
I see
#!/usr/bin/perl -- use strict; use warnings; use Data::Dump; my $stuff = q{set zone "VLAN" vrouter "trust-vr" set zone id 100 "Internet_Only"}; open my($in), '<', \$stuff; while(my $line = <$in>){ chomp $line; if ($line =~ /^set\szone\s("([^"]*)"|id\s\d+\s"([^"]*)")/) { my $zone = $1; #~ print "Config line=> $lineCount; Value=> $line; zone= +> $zone\n"; #~ print "Config line=> $.; Value=> $line; zone=> $zone\ +n"; dd [ $., $line, { 1, $1, 2, $2 } ]; } } __END__ [ 1, "set zone \"VLAN\" vrouter \"trust-vr\"", { 1 => "\"VLAN\"", 2 => "VLAN" }, ] [ 2, "set zone id 100 \"Internet_Only\"", { 1 => "id 100 \"Internet_Only\"", 2 => undef }, ]
So that shows some problem, sometimes you want $1, sometimes $2, but then sometimes stuff is missing ... but if you replace that if block with
use Text::Balanced qw/ :ALL /; my @parts = extract_multiple( $line, [ sub { extract_delimited( $_[0], '"', ); }, ], ); dd\@parts;
you get
["set zone ", "\"VLAN\"", " vrouter ", "\"trust-vr\""] ["set zone id 100 ", "\"Internet_Only\""]
You could do the same with
my @parts = split /("[^"]*")/, $line; dd\@parts;
Or a more complete pattern from http://search.cpan.org/perldoc/Text::Balanced#gen_delimited_pat
my @parts = split /((?:\"(?:\\\"|(?!\").)*\"|\'(?:\\\'|(?!\').)*\'))/, + $line; dd\@parts;
In reply to Re: Problem with alternating regex?
by Anonymous Monk
in thread Problem with alternating regex?
by dwlepage
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |