2017-12-12 28 views
1

私はPerlで新しく、最初の正規表現以外のものを印刷したいと思います。 txtファイルにはshutdownという57回含まれていますが、次のコードでは最初の一致が返されます。Perlより多くの行を印刷

#!/usr/bin/perl 
use strict; 
use warnings; 

use Path::Tiny; 
use autodie; 

my $dir = path("H:/Perl"); 

my $file = $dir->child("test.txt"); 

my $content = $file->slurp_utf8(); 

my $file_handle = $file->openr_utf8(); 

(my $test) = $content =~ m/^.+$(?=\s+shutdown)/mg;{ 
print "$test\n"; 
} 

私はwhile loopを試しましたが、私はうまくいきませんでした。手伝ってくれてありがとう。

編集:ここでは は、いくつかの例のデータである:

interface port-channelxyc 
description provdb002 
shutdown 
switchport access vlan 123 
spanning-tree port type edge 

interface port-channel456 
description provdb002 
switchport access vlan 32 
spanning-tree port type edge 

interface port-channel200 
shutdown 

私はバックだけだ: 「説明provdb002」 を、それは停止しますが、私はまた、次のいずれかを取得したい:「インタフェースポート-channel200」あなたが私の言いたいことを理解してくれることを願っています。

+1

。 'my @ary = $ content =〜...' – zdim

+0

いくつかのサンプルデータを提供して、希望の出力を与えることができますか?聞こえる危険性がありますが、そのファイルは確かに 'utf8'ですか、それはそれほど一般的ではないのですか?このパターンの問題は、リストを返すことですが、正しいものをキャプチャしているかどうかはわかりません。 – Sobrique

+0

質問を編集してそこにデータを追加してください。あなたがそれをコメントに入れれば、改行がどこにあるかを知ることは不可能です。 – Borodin

答えて

3

いいえ、データは空白で区切られているようです。

簡単には、$/を使用し、それを''に設定することで、perlはそれを簡単にサポートします。

だから、あなたはそうのようなあなたのファイルを反復処理することができます:あなたのサンプルデータが印刷されるため

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

local $/ = ''; 
while (<>) { 
    my %this_int = m/([\w\-]+) ?(.*)/g; 

    if (exists $this_int{'shutdown'}) { 
     print $this_int{'interface'}, " ", $this_int{'description'} // ''," is shut down\n"; 
    } 
} 

:あなたの正規表現は `/ G`でリストを返す_does_

port-channelxyc provdb002 is shut down 
port-channel200 is shut down 
+1

これは、 'm/...()...().../g'の結果を'%hash "に直接代入するのは良い考えです。私はそれを覚えています。 – PerlDuck

関連する問題