2014-12-29 1 views
2

:펄의 Foreach 때까지 나는 같은 출력이 루프

Id: 214215 
Time: 5:07 
jName: Bar_Start 
joutcome: warning 
pName: Bar 
jstatus: running 
stepName Start: 
    outcome: success 
    status: completed 
---End Step--- 
stepName A: 
    outcome: success 
    status: completed 
---End Step--- 
stepName B: 
    outcome: success 
    status: completed 
---End Step--- 
stepName C: 
    outcome: success 
    status: completed 
---End Step--- 
stepName DC: 
    outcome: warning 
    status: completed 
---End Step--- 
---------------END FINAL--------------- 
Id: 123456 
Time: 11:08 
jName: Foo_Start 
joutcome: success 
pName: Foo 
jstatus: completed 
stepName A: 
    outcome: success 
    status: completed 
---End Step--- 
stepName AD: 
    outcome: success 
    status: completed 
---End Step--- 

내가 전에 각 라인 "--- 최종 단계 ---"헤더를 포함하도록 그것을 구문 분석하고 싶습니다

foreach my $key (keys %rowdata) { 
     if ($row =~ m/\s*$key:.*/) { 
      $rowdata{$key} = $row; 
     } 
     } 
: 나는 내가 채우려면 다음 내 해시 같은 것을 할 필요가 생각

my %rowdata = (
    Id   => "214215", 
    Time   => "5:07", 
    jName   => "Bar_start", 
    jOutcome  => "warning", 
    pName   => "Bar", 
    jStatus  => "running", 
    stepName  => "Start", 
    outcome  => "success", 
    status  => "completed", 
); 

    my %rowdata = (
    Id   => "214215", 
    Time   => "5:07", 
    jName   => "Bar_start", 
    jOutcome  => "warning", 
    pName   => "Bar", 
    jStatus  => "running", 
    stepName  => "A", 
    outcome  => "success", 
    status  => "completed", 
); 

    my %rowdata = (
    Id   => "214215", 
    Time   => "5:07", 
    jName   => "Bar_start", 
    jOutcome  => "warning", 
    pName   => "Bar", 
    jStatus  => "running", 
    stepName  => "B", 
    outcome  => "success", 
    status  => "completed", 
); 

... 

    my %rowdata = (
    Id   => "123456", 
    Time   => "11:08", 
    jName   => "Foo_start", 
    jOutcome  => "success", 
    pName   => "Foo", 
    jStatus  => "completed", 
    stepName  => "A", 
    outcome  => "success", 
    status  => "completed", 
); 

:는 같은 해시에 저장됩니다

그러나 헤더를 한 단계로 분리하는 방법을 잘 모르는 경우에는 새 헤더를 포함시켜야합니다. --- 최종 결과 ---

그런 다음 각 저장된 해시를 반복하고 싶습니다. 현재 상황에 기초한 물건. 현재 출력은 배열 (@rows)

+0

샘플 데이터에 대해 생성하려는 실제 해시의 예를 '' ''대신 자리 표시 자로 표시하십시오. 당신의 입력에서 각각의'jName'은 여러개의'stepName' 블럭을 가지고있는 것처럼 보입니다, 그래서 여러분의 해시에있는'stepName' 필드는 배열을 포함합니까? – ThisSuitIsBlackNot

+0

아니요, 해시 당 하나의 jName 및 하나의 stepName이 있어야합니다. 따라서 x 번호의 해시가 x 개 이전에 나올 것입니다. --- 최종 마무리 --- –

+0

해시가 어떻게 표시 될지 편집했습니다. –

답변

2

각 매개 변수의 단지 최신 값을 유지하고 ---End Step---의 각 발생에 목록에 일련의 값을 저장해야 할 것 같습니다에 저장됩니다.

이 프로그램은 정확하게 작동합니다. 나는 Data::Dump을 사용하여 결과 데이터 구조가 요청되었음을 증명했다.

마지막 출력 레코드는 끝에서 두 번째 입력 레코드의 내용을 반영합니다. 샘플 데이터를 사용하여 여기에 표시된 출력을 생성했습니다.

use strict; 
use warnings; 

open my $fh, '<', 'data.txt' or die $!; 

my (@data, %rowdata); 

while (<$fh>) { 
    if (/^\s*(\w+) \s* : \s* (.*\S) /x or/\b (stepName) \s* (\w+) : /x) { 
    $rowdata{$1} = $2; 
    } 
    elsif (/---End Step---/) { 
    push @data, { %rowdata }; 
    } 
} 

use Data::Dump; 
dd \@data; 

출력

[ 
    { 
    Id  => 214215, 
    jName => "Bar_Start", 
    joutcome => "warning", 
    jstatus => "running", 
    outcome => "success", 
    pName => "Bar", 
    status => "completed", 
    stepName => "Start", 
    Time  => "5:07", 
    }, 
    { 
    Id  => 214215, 
    jName => "Bar_Start", 
    joutcome => "warning", 
    jstatus => "running", 
    outcome => "success", 
    pName => "Bar", 
    status => "completed", 
    stepName => "A", 
    Time  => "5:07", 
    }, 
    { 
    Id  => 214215, 
    jName => "Bar_Start", 
    joutcome => "warning", 
    jstatus => "running", 
    outcome => "success", 
    pName => "Bar", 
    status => "completed", 
    stepName => "B", 
    Time  => "5:07", 
    }, 
    { 
    Id  => 214215, 
    jName => "Bar_Start", 
    joutcome => "warning", 
    jstatus => "running", 
    outcome => "success", 
    pName => "Bar", 
    status => "completed", 
    stepName => "C", 
    Time  => "5:07", 
    }, 
    { 
    Id  => 214215, 
    jName => "Bar_Start", 
    joutcome => "warning", 
    jstatus => "running", 
    outcome => "warning", 
    pName => "Bar", 
    status => "completed", 
    stepName => "DC", 
    Time  => "5:07", 
    }, 
    { 
    Id  => 123456, 
    jName => "Foo_Start", 
    joutcome => "success", 
    jstatus => "completed", 
    outcome => "success", 
    pName => "Foo", 
    status => "completed", 
    stepName => "A", 
    Time  => "11:08", 
    }, 
    { 
    Id  => 123456, 
    jName => "Foo_Start", 
    joutcome => "success", 
    jstatus => "completed", 
    outcome => "success", 
    pName => "Foo", 
    status => "completed", 
    stepName => "AD", 
    Time  => "11:08", 
    }, 
] 

업데이트

What would be the appropriate call to an array such as this? 

If I wanted to do a `foreach` loop of it, would it be something like 

    foreach %key (@data) { 
     if (key{jName} =~ Foo_start) { 
     #then do this 
     } 
    } 

내가 당신에 %rowdata의 내용을 복사하고 저장하는 것이 제안함으로써 실수를했다고 생각 각 OC Currence는 ---End Step---입니다. 데이터를 순차적으로 처리하는 것만이라면 push @data, { %rowdata } 대신 process_rowdata(\%rowdata)을 작성하는 것이 가장 좋습니다.

그러나, 질문에 대한 즉각적인 대답은 당신이

for my $rowdata (@data) { 
    next unless $rowdata->{jName} eq 'Foo_start'; 
    # Do stuff with $rowdata 
} 

를 사용하여 @data을 반복 할 수 있다는 것입니다하지만 당신은 당신의 목적을 설명하지 않은,이 같은 루프에서 항목을 선택하는 비효율적 인 방법이다 목록을 한 번 또는 두 번 이상 수행해야하거나 목록이 작 으면

+0

나는 이것을 좋아한다. 이와 같은 배열에 대한 적절한 호출은 무엇입니까? foreach 루프를 수행하고 싶다면'foreach % key (@data) {if (key {jName} = ~ Foo_start) {# 그러면 이렇게}}' –

+2

@EvanMiller : 당신은 Perl로 당신의 깊이를 넘어서는 길입니다. 스택 오버플로는 가장 일반적인 프로그래밍 문제에 대한 재무보고를 작성하는 것을 주 목표로합니다. 그렇기 때문에 마음의 최고가 아이디어를 토론하고 좋은 솔루션이라고 믿는 * 베스트 * 솔루션을 선택하거나 유가인들이 아무런 가치가없는 고 부가가치 컨설팅을 얻는 곳으로 선택할 수있는 포럼의 무대가되었습니다. 너는이 모든 것에 어디서 빠졌다고 생각하니? 해시 참조 배열을 반복하는 Perl 코드를 작성할 수 없다면, 할 수있는 사람에게 비용을 지불해야할까요? – Borodin

+0

스택 교환에 언급 된 것처럼 완전히 "스택 오버플로는 전문적이고 열성적인 프로그래머를위한 질문 및 답변 사이트입니다." 이 질문은 프로그래밍 질문에 대한 최상의 솔루션을 논의 할 수있는 훌륭한 장소라는 것에 동의하지만, 사람들이 새로운 개념과 아이디어에 대한 지식을 넓히고 확대 할 수있는 장소이기도합니다. 질문 및 응답 형식의 이유를 설명합니다. 나는 열정적 인 프로그래머 범주에 속한다고 말하며,이 개념 중 일부는 처음이지만 배우는 것을 좋아합니다. –