Text::Balanced perl 模块的正确用法
Correct usage of Text::Balanced perl module
我正在尝试使用 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 解析的特定解决方案)
请指教
谢谢
在正则表达式中你可以使用这个:
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: \n" while($str=~m/\{((?:[^{}]++|\{(?1)\})++)\}/gs);
我正在尝试使用 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 解析的特定解决方案)
请指教
谢谢
在正则表达式中你可以使用这个:
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: \n" while($str=~m/\{((?:[^{}]++|\{(?1)\})++)\}/gs);