2017-12-12 27 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을 시도했지만 제대로 작동하지 않았습니다. 도와 주셔서 감사합니다. '인터페이스 포트 channel200'편집

: 내가 다시에만있어

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' 은 다음 중지를,하지만 난 다음 한도 얻을 싶어 등등 ... 내가 무슨 뜻인지 알기를 바랍니다.

+1

귀하의 정규식이'/ g'와 목록을 반환 _does_; 그래서 그것을 배열에 할당하십시오.'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"; 
    } 
} 

은 샘플 데이터가 인쇄됩니다 어떤 :

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

'm/...() ...() .../g'의 결과를'% hash "에 직접 할당하는 것은 꽤 좋은 생각입니다. 나는 그것을 기억할 것이다. – PerlDuck