2017-07-21 11 views
1

中括弧で囲まれたテキストを抽出する目的で、Text :: Balanced perlモジュールを使用しようとしています。この特定のケースでは、入力は設定ファイル/etc/named.confですが、私は一般的な使い方を探しています。 問題は、私がundefという結果を得て、結果として初期化されていない値のエラーであるということです。ここでText :: Balanced perlモジュールの正しい使い方

は私のコードである(それは今ちょうど切り株だ、まだ再帰や他のものを扱っていない):

#!/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の解析のための具体的な解決策に適合しない方法で答えます)

おかげ

あなたがこれを使用することができます正規表現で
+0

'通常、あなたが最初の非brace-と一致する必要が' { 'ようで始まらないnamed.conf'接頭辞として囲まれた部分。 –

答えて

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); 
+0

私はもともとText :: Balancedモジュールの使用について特別に尋ねましたが、あなたのやり方も同様に機能しました。ありがとうございました – Yakup

関連する問題