2013-10-03 2 views
0

perforce 명령을 실행하고 결과를 변수 $command에 저장하는 Perl 스크립트가 있습니다.Perl을 사용한 시스템 명령 실행

그러면 파일 log.txt에 저장되고 정규식을 사용하여 관련 데이터가 추출됩니다. 나 혼자 그 명령을 실행하면

다음과 같은 것들이 튀어 다음과 같이

4680 p4exp/v68  PJIANG-015394 25:34:19 IDLE none 
    8869 unnamed p4-python  R integration semiconductor-project-trunktip turbolinuxclient 01:33:52 IDLE none 
    8870 unnamed p4-python  R integration remote-trunktip-osxclient 01:33:52 

코드는 간다 :

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

my $command = qx |p4 monitor show -ale|; 

open FH, '>>', "log.txt"; 
print FH $command; 
close FH; 

open my $log_fh, '<', '/root/log.txt'; 
my %stat; 
while ($line = <$log_fh>) { 
    chomp $line; 
    next if not $line =~ /(\d+)\s+/; 
    my $killid = $1; 
    if ($line =~ /R\s+integration/ and $line =~ /IDLE\s+none$/) { 
    my $killid_details = $line; 
    $stat{$killid} = $killid_details; 
    } 
} 
close $log_fh; 

my $killpro; 
foreach my $kill (keys %stat) { 
    print "$kill\n"; 
} 

다음은 숫자 8869하지만 어떻게 로그 않고 그것을 수행하는 방법을 가져옵니다. txt. 어레이를 사용하는 것이 더 좋은 방법일까요, 해시가 괜찮습니까?

나는 아직도 배우기 때문에 저를 정정하십시오.

+0

EOL 앵커를 사용하고 있으므로 두 개의 별도 정규식을 수행 할 필요가 없습니다. 그것은 간단하게'/ R \ s + integration. * IDLE \ s + none $ /'에 결합 될 수 있고 그것의 한 줄이더라도'/ R [^ \ S \ n] + 통합을 사용할 것입니다. * IDLE [^\ S \ n] + 없음 $ /'을 선택하십시오. – sln

답변

1

주요 걸림돌처럼 루프별로 줄 단위 입력이 표시됩니까?

my $killid; 
my @lines = split("\n", $command); #split on newlines 
for my $line (@lines) { 
    next if not $line =~ /(\d+)\s+/; 
    my $id = $1; 
    if ($line =~ /R\s+integration/ and $line =~ /IDLE\s+none$/){ 
     $killid = $id; 
    } 
} 

한 가지주의 : 줄 바꿈에

분할 트릭 어떻게해야 당신이 8870의 출력을 언급,하지만 난 당신이 "통합"과 선을 찾고 준 8869. regexps '에 받고 있어요 및 "IDLE none"그리고 8869와 일치하는 것으로 보이는 입력 예를 들어 보겠습니다.

해시는 괜찮습니다. 단 하나의 키만 사용하는 경우에도 마찬가지입니다. 단일 변수를 사용하십시오.

+0

나는 위의 질문을 편집했다. 바로 당신이 8869에 관한 것이다. 당신의 코드가 잘 작동하고 목적을 달성 해 주셔서 감사합니다. 또한 해쉬에 대한 하나의 참조를 언급했습니다. 다른 killid가 해시에 대한 다른 키 또는 해당 참조가 아닌 것으로 간주됩니까? 제발 당신은 정교 할 수 있습니다. 고맙습니다. – deep

+1

@deep : 여러분이 보여주는 데이터는'R integration'과'IDLE none'을 포함하는 한 줄 밖에 없습니다. 그것이 항상 그렇다면 해시를 사용할 필요가 없습니다. 단일 스칼라이면 충분합니다. 그러나 때로는 여러 라인이있을 수 있다면 해시가 필요합니다. – Borodin

+0

두 분 모두 자리하고 있습니다. 내 부분에 대한 감독을 유감으로 생각합니다. – rutter

1

qx 구문의 결과를 스칼라가 아닌 배열에 할당하면 자동으로 행으로 분할됩니다. 이 코드는 설명합니다.

use strict; 
use warnings; 

my @lines = qx|p4 monitor show -ale|; 

my %stat; 
for my $line (@lines) { 
    chomp $line; 
    next unless $line =~ /(\d+)\s+/; 
    my $killid = $1; 
    if ($line =~ /R\s+integration/ and $line =~ /IDLE\s+none$/) { 
    $stat{$killid} = $line; 
    } 
} 

print "$_\n" for keys %stat; 
+0

여기 당신이 내게 좋은 의문을여 셨습니다. 감사. – deep

관련 문제