2014-09-25 2 views
0

내 문제의 그런 큰 부분을 게시 사전에 저를 용서해주십시오,하지만 난 그냥 실패 부분에 내 손가락을 넣어 수 없습니다 이 같은 (ABAS-FO 당신은 알고 걱정 경우).무한 재귀

.fo U|xiininputfile = whatever 
.type text U|xigibsgarnich 
.assign U|xigibsgarnich 
.. 
..Comment 
.copy U|xigibswohl = Spaß 
.ein "ow1/UWEDEFTEST.FOP" 
.in "ow1/UWEINPUT2" 
.continue BOTTOM 
.read "SOemthing" U|xttmp 
!BOTTOM 
.. 
.. 

가 지금은 .IN 각에 따라 재귀하려면 [넣어]/EIN [별점] -statement, 언급 된 파일을 구문 분석하고 내가 돈이 ' 그것을 아직 알지 못한다면 그것을 배열에 추가하십시오. 내 코드는 다음과 같습니다

이 같은 (경로가를 기준으로 같은 디렉토리에) 스크립트를 호출
#!/bin/awk -f 

function getFopMap(inputregex, infile, mandantdir, infiles){ 
    while(getline f < infile){ 
     #printf "*" 
     #don't match if there is a ' 
     if(f ~ inputregex "[^']"){ 
      #remove .input-part 
      sub(inputregex, "", f) 
      #trim right 
      sub(/[[:blank:]]+$/, "", f) 
      #remove leading and trailing " 
      gsub(/(^\"|\"$)/,"" ,f) 

      if(!(f in infiles)){ 
       infiles[f] = "found" 
      } 
     } 
    } 
    close(infile) 

    for (i in infiles){ 
     if(infiles[i] == "found"){ 
      infiles[i] = "parsed" 
      cmd = "test -f \"" i "\"" 
      if(system(cmd) == 0){ 
       close(cmd) 
       getFopMap(inputregex, f, mandantdir, infiles) 
      } 
     } 
    } 
} 

BEGIN{ 
    #Matches something like [.input myfile] or [.ein "ow1/myfile"] 
    inputregex = "^\\.(in|ein)[^[:blank:]]*[[:blank:]]+" 

    #Get absolute path of infile 
    cmd = "python -c 'import os;print os.path.abspath(\"" ARGV[1] "\")'" 
    cmd | getline rootfile 
    close(cmd) 

    infiles[rootfile] = "parsed" 
    getFopMap(inputregex, rootfile, mandantdir, infiles) 

    #output result 
    for(infile in infiles) print infile 
    exit 
} 

:

./script ow1/UWEDEFTEST.FOP

출력이 없습니다. 그냥 끊깁니다. printf "*"명령 전에 주석을 제거하면 끝나지 않고 별을 볼 수 있습니다.

모든 도움과 의견을 보내 주시면 감사하겠습니다.

내 AWK : 둔한 버전 3.1.7

+0

'BEGIN' 블록 내 모든 작업을 수행합니다. – fedorqui

+0

gawk의 아주 오래된 버전입니다. 매우 유용한 기능이 많지 않으므로 현재 버전으로 업그레이드해야합니다. –

+0

@fedorqui 알아요. 나중에 프로그램에서 재귀 적으로 발견 된 파일을 읽어야하므로 {} 기능을 사용하는 이유가 표시되지 않고 하나의 파일 만 처리합니다. 하지만 어쩌면 나는 중요한 것을 놓치고있어. –

답변

1

는 당신의 유일한 문제를 나도 몰라하지만 일부 시나리오에서 무한 루프로 들어갑니다 잘못과 그 결과의 getline을 호출하고 있습니다. 모든 경고를 http://awk.info/?tip/getline으로 완전히 이해했는지 확인하고 코드의 시작점으로 재귀 예제를 사용하는 것이 좋습니다.

처음에는 코드에 가장 중요한 항목은 getline이 실패 할 경우 음수 값을 반환 할 수 있기 때문에 실패한 getline이 항상 0이 아닌 값을 반환하므로 계속 호출되므로 무한 루프가 생성됩니다. 계속 실패하십시오. 대신 while ((getline f < infile) > 0)을 사용해야합니다.

+0

여전히 읽고 이해하려고합니다. –

+0

나는 나의 대답에 당신을위한 첫 걸음을 더했습니다. –

+1

방금 ​​이걸 우연히 발견했습니다 ... 죄송합니다. 좋은 하루 되세요. –