正确使用Text :: Balanced perl模块

时间:2017-07-21 11:44:37

标签: perl parsing perl-module brackets

我正在尝试使用Text :: Balanced perl模块来提取括在大括号中的文本。在这种特殊情况下,输入是bind配置文件/etc/named.conf,但我正在寻找一般用途。 问题是,我得到undef结果,结果是未初始化的值错误。

这是我的代码(它现在只是一个树桩,还没有处理递归和其他东西):

#!/usr/bin/env perl
use strict;
use diagnostics;

use Text::Balanced qw (
                       extract_bracketed
                      ) ;


my $config = '/etc/named.conf';

open my $fh, '<', $config or die "Cannot open $config: $!";
$/ = undef;
my $text = <$fh>;
close $fh;

my $content = extract_bracketed( $text, '{}' );
print $content ;

我已阅读http://perldoc.perl.org/Text/Balanced.html并且无法弄清楚,我做错了什么(我使用标量变量代替数组,但这应该不是问题)

此处也有一个类似的问题Text::Balanced and multiline xml,但它的回答方式不符合我的用例(.xml解析的特定解决方案)

请告知

由于

1 个答案:

答案 0 :(得分:0)

在正则表达式中,你可以使用它:

my $str = '
<statement-1> ["<statement-1-name>"] [<statement-1-class>] {
    { {<option-1>;}
   <option-2>;}
   <option-N>;
};

<statement-2> ["<statement-2-name>"] [<statement-2-class>] {
   <option-1>;
   <option-2>;
   <option-N>;
};

<statement-N> ["<statement-N-name>"] [<statement-N-class>] {
   <option-1>;
   <option-2>;
   <option-N>;
};';

print "L: $1\n" while($str=~m/\{((?:[^{}]++|\{(?1)\})++)\}/gs);