On Tue, Nov 16, 2010 at 2:14 PM, Jim Gibson <[email protected]> wrote:
> On 11/16/10 Tue  Nov 16, 2010  1:07 PM, "Vincent Li"
> <[email protected]> scribbled:
>
>> On Tue, Nov 16, 2010 at 9:38 AM, Jim Gibson <[email protected]> wrote:
>
>>>
>>> You need a parser to do this right. You might have some luck by reading the
>>> entire file into a scalar variable and using the Text::Balanced module
>>> together with some regular expressions to extract and parse the various
>>> blocks within the file.
>>>
>>> A more rigorous approach would be to create a real parser with the
>>> Parse::RecDescent module and create a grammar for your file. However, that
>>> module has a steep learning curve and can be slow.
>>
>> thanks for the reply, maybe I just make everyone think too deep for
>> this problem, if that is true, sorry about that. let me rephrase what
>> I want to achieve. the file look like this:
>>
>> vlan vlan10 {
>>    tag 1330
>>    interfaces tagged 1.1
>> }
>> route domain 10 {
>>    parent id 0
>>    description "RD10"
>>    vlans vlan10
>> }
>> profile smtp smtp {
>>    defaults from none
>>    security enabled enable
>> }
>> profile oneconnect oneconnect_global {
>>    defaults from oneconnect
>> }
>> profile tcp tcp {
>>    reset on timeout enable
>>    time wait recycle enable
>> }
>> self 10.99.91.1 {
>>    netmask 255.255.255.0
>>    vlan vlan11
>>    allow default
>> }
>> failover {
>>    standby link down time 0
>> }
>>
>> My aim is to remove specific profile.*{} block from that file, I have
>> an half working script I wrote here:
>>
>> #!/usr/bin/perl
>> use strict;
>> use warnings;
>>
>> my $holdTerminator = $/;
>> undef $/;
>> open(my $fh, '<', "/tmp/test1.scf") or die $!;
>> my $text = <$fh>;
>> while(<DATA>) {
>> chop;
>
> Try chomp here instead of chop.
>
>> $text =~ s/$_\s{.*?}//gs;
>> }
>> #$text =~ s/profile tcp tcp\s{.*?}//gs;
>> print $text;
>> $/ = $holdTerminator;
>>
>> __DATA__
>> profile auth ssl_ocsp
>> profile stats stats
>> profile stream stream
>> profile auth tacacs
>> profile tcp tcp
>> profile tcp tcp-cell-optimized
>> profile tcp tcp-lan-optimized
>> profile tcp tcp-wan-optimized
>> profile udp udp
>>
>>
>> my intention is to find any profile list in __DATA__ and remove the
>> whole block from that file, now the problem is in the while loop, it
>> appear that the regex and substituation is not working, but if comment
>> out the while loop block and hard code the profile pattern in the
>> subsituation regex, it works, what I am missing?
>
> What platform are you using? I did have the same problem until I made sure
> there were only linefeeds in the file and I used chomp instead of chop. The
> search pattern I was reading from <DATA> contained a carriage return "\r" on
> the end.
>
> Run your output through a hex/octal dump program, e.g. on unix:
>
> perl program.pl | od -c
>
> to see the characters, and print the search patterns you read from <DATA> in
> your program:
>
> while(my $pat = <DATA>) {
>  chomp($pat);
>  print "Apply <$pat>\n";
>  $text =~ s/$pat\s{.*?}//gs;
> }

Jim, thanks for the tips, I got it working now, but not with nested {}
block, I am running out of idea on the nested {} block issue, the
parser route seems complicate to me as my Perl is still rough :)

Vincent

--
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
http://learn.perl.org/


Reply via email to