0

出力が特定の単語で始まり、特定の単語/文字で終わる場所から詳細を取得しようとしている配列にいくつかの出力があります。この出力は、画面に出力されます。

私が扱っている配列の出力は次のとおりです。

router rip
 version 2
 redistribute bgp 45134 metric 3
 passive-interface Serial1/3:1.333
 passive-interface Serial3/1:3.333
 passive-interface Serial3/1:5.333
 passive-interface Serial3/2:1.333
 passive-interface Serial3/4:1.333
 passive-interface Serial3/4:17.333
 passive-interface Serial6/1:1.333
 no auto-summary
 !
 address-family ipv4 vrf TestVRF-0001
 redistribute bgp 45134 metric 3
 network 10.0.0.0
 no auto-summary
 version 2
 exit-address-family
 !

これまでに生成した perl コードは次のとおりです。

    elsif ( $action eq "show_vrf1" ) {
            my $cmd = "show run | begin router rip";
            my @lines = $s->cmd(String => $cmd,
                            Prompt  => "/$enableprompt/",
                            Timeout => 10);
            foreach my $line (@lines) {
                if(/address-family ipv4 vrf TestVRF-0001.*?!/){
                $result=$1;
                print $result;
                }
            }
    }

私は配列から以下のものだけを引き出したいと思っています:

 address-family ipv4 vrf TestVRF-0001
 redistribute bgp 45134 metric 3
 network 10.0.0.0
 no auto-summary
 version 2
 exit-address-family
 !

何らかの理由で、スクリプトを実行すると、配列からデータが取り出されない空白の画面が表示されます。

4

2 に答える 2

1
                if($line =~ /address-family ipv4 vrf TestVRF-0001.*?!/){

それ以外の

                if(/address-family ipv4 vrf TestVRF-0001.*?!/){

?

于 2013-07-22T09:41:47.330 に答える
0

$line を正規表現と照合します。期待する出力は 1 行ではないため、一致する行はありません。

複数行の文字列全体をスカラーに格納できます。

my $output = join q(), $s->cmd(...);

次に、括弧を使用して文字列の一部を実際にキャプチャすると、出力を取得できます。

if ($output =~ /(address-family ipv4 vrf TestVRF-0001.*?!)/s) {
    my $result = $1;

/s修飾子は、ドットを改行に一致させるために必要であることに注意してください。通常は必要ありません。

于 2013-07-22T09:44:32.353 に答える