2014-11-17 2 views
-1

내 ne 연산자가 아래 if 문에서 작동하지 않는 이유를 알려주실 수 있습니까? 작동하지만 프로그램을 저장 한 후에 작동이 멈췄습니다. 어떤 도움이라도 대단히 감사하겠습니다.Perl, ne 연산자가 작동하지 않습니다.

$inFile = "animals.txt"; 
open (IN, $inFile) or 
die "Can't find file: $inFile"; 

@animallist = (<IN>); 

foreach $line (@animallist) 
{ 
    if ($line =~ $search) 
    { 
    print "$line <br> <br>";  
    } 
} 
if ($line ne $search) 
{ 
    print "$search isn't in the animal list"; 
} 

print end_html; 
+1

당신은 왜 그것이 작동하지 않는다고 생각합니까? – TLP

+5

항상 맨 위를 넣으십시오 :'use strict; ' –

+0

첫 번째 if 문은 작동하지만 파일에서 단어를 찾으면 마지막 print 문도 출력합니다. "$ 검색은 동물 목록에 없습니다" – TheHadimo

답변

1

들여 쓰기를 사용하면 부적절한 장소에서 블록이 끝나는 것을 볼 수 있습니다.

($ line ne $ search)가 파일에서 $ line을 채우고 처리하는 foreach 루프 내에 있지 않은 경우에도 마찬가지입니다. 나는 적어도 당신이 찾고 있다고 생각하는 기능을 얻으려면 블록 안에 넣는 것이 좋습니다.

+0

그래,하지만 For 루프 안에 넣으면 동물 목록에 $ search가 반복해서 나타나지 않는다. – TheHadimo

+0

그 줄이 일치하지 않아 원하는대로 반복해서 인쇄한다. 일치하지 않을 때 인쇄 할 수 있습니다. 나는 당신의 재미있는 논리에 관해서는 아무 것도 할 수 없지만 그것이 당신이 찾고있는 논리입니다. 일반적으로 당신이 성취하고자하는 것으로부터, 부울 플래그 또는 데이터 구조를 구현하여 목록에있는 동물들이 일치하는지 확인할 수 있어야합니다. if ($ line ne $ search)조차도 아마 단순한 else로 더 좋습니다. –

5

프로그램에서하는 일에 대해 혼란스러워 보였습니다.

$inFile = "animals.txt"; 
open (IN, $inFile) or die "Can't find file: $inFile"; 
@animallist = (<IN>); 

# here you define a file name, open a file, and read all of the lines 
# in the file into the array @animallist 

foreach $line (@animallist) { 
# here you iterate over all the lines, putting each line into $line 
    if ($line =~ $search) { 
    print "$line <br> <br>";  
    } 
# here you perform the regex match: $line =~ /$search/ and if it 
# succeeds, print $line 
} 
# here you end the loop 

if ($line ne $search) { 
    print "$search isn't in the animal list"; 
} 
# here you take the now uninitialized variable $line and try to match 
# it against the as of yet undefined variable $search 
# If both of these variables are undefined, and you are not using warnings 
# it will simply return false (because "" ne "" is false) 
# without warning about undefined variables in ne 

당신은 당신의 전체 라인이 경우에도, 예를 들어, cat, 당신은 여전히 ​​파일에서 읽을 때, 그것은 뒤에 줄 바꿈을 가지고 있기 때문에, 문자열 catne를 사용하여 비교할 수 없다는 것을 알고 있어야합니다, 그래서 그것은 정말로 cat\n입니다. 너 chomp이 아니라면.

으로 보이지만 파일을 읽은 후 파일에 $search이 포함되어 있는지 확인할 수는 없습니다. 파일을 읽는 동안 그렇게해야합니다.

+0

foreach 루프 변수 (예 :'$ line')는 루프가 반복되는 목록의 각 요소에 대해 일시적으로 별칭이 지정되기 때문에 "여기 초기화되지 않은 변수 $ line"을 사용합니다. 루프가 종료되면 앨리어싱이 사라져 효과적으로 변수의 원래 값으로 복원됩니다. 간단히 말해, for $ var (...) {...}'는 의미가 없습니다. 항상'for my $ var (...) {...}'를 사용하십시오. – ikegami

1

$search에 무엇이 포함되어 있는지 모르기 때문에 어떤 일이 일어날 지 알기가 어렵습니다. 파일에있는 동물의 이름이라고 가정 해 봅시다.

당신은 당신의 코드를 실행

, $search이 포함 ( $line은 당신의 foreach 루프 내에서 데이터를 포함로) 말, "개구리"와 $lineundef이 포함되어 있습니다. 이러한 값은 같지 않으므로 ne이 true를 반환하고 메시지가 인쇄됩니다.

if 문을 foreach 블록으로 옮기려면 $line 값이 있어야합니다. 그러나 여전히 줄 바꿈 문자가 첨부 된 파일에서 줄을 읽으면서 일치하지 않습니다. 그리고 "개구리"는 "개구리 \ n"과 같지 않습니다. $line에서 개행을 제거하려면 chomp()을 사용해야합니다.

이것은 another recent question과 매우 유사합니다. 같은 숙제를하고 있니?

0

나는 여러 지점이 여기에 있다고 생각 :는 $ 라인은 선언 된 foreach는의 범위를 벗어나있는 경우 ($ 라인 북동 $ 검색)에 대한

  • 당신은 아니기 때문에 strict를 사용하면 오류가 발생하지 않으며이 조건이 항상 true이어야합니다.

  • $ 행에 개행 문자가 있다고 가정하고이 $ 행을 $ search와 비교하면 문자열이 같지 않아도 조건이 참일 수 있습니다.

이 $ 라인 = "사자 \ 없음"과 $ = "사자"다음 ($ 라인 = ~ $ 검색) 경우 어떻게하면

, 조건이 될 것이다는 사실 검색하기 때문에 가정 "사자"는 "사자 \ n"문자열의 일부입니다.즉, if ($ line eq $ search)가 거짓 이고 if ($ line ne $ search)가 맞다고 가정 할 때 귀하의 경우입니다.

chomp ($ line) 함수를 사용하여 문자열 끝에서 줄 바꿈을 제거 할 수 있습니다.

이 정보가 도움이되기를 바랍니다.

관련 문제