2012-10-24 5 views
0

나는 단지 펄을 배웠고 동시에 정규 표현식을 배우려고합니다. 기본적으로 로그 파일을 열고 사용자 입력과 일치하는 모든 줄을 새 파일에 인쇄하려고합니다. 다음 코드를 사용하면 "Clinton"이라는 단어를 입력해도 출력이 전혀 들지 않습니다. 내가Perl 정규식이 사용자 입력에서 일치합니다.

print MYFILE if /\Clinton\; 

print MYFILE if /\$string\; 

를 대체 할 경우 예상대로하지만 실행됩니다. 어떤 아이디어? 내가 빠뜨린 것은 간단하다는 것입니다.

print "Enter a word to look up: "; 
$string = <>; 
print "You put $string"; 
open(LOG,"u_ex121011.log") or die "Unable to open logfile:$!\n"; 
open (MYFILE, '>>data2.txt'); 
while(<LOG>){ 
    print MYFILE if /\Q($string)\E/; 
} 
close (MYFILE); 
close(LOG); 
print "Check data2.txt"; 

답변

-1

무엇 ruakh는 문자열이 $_ 변수와 =~ 연산자를 사용하여 라인에 있는지 확인해야했다합니다. 귀하의 코멘트 떨어져가는

print MYFILE "$_\n" if $_ =~ /\Q$string\E/; 

, 당신은 놀라 울 정도로 split를 사용하여 라인을 분할 할 수 있습니다. http://perldoc.perl.org/functions/split.html

+0

굉장합니다. 고맙습니다. – Ryan

+0

다른 질문이 있습니다. 내 로그 파일에는 공백으로 구분 된 열이 있습니다. 나는 네가 발생하는 네 번째 공간 전에 모든 것을 원하고 다른 것을 원하지 않는다는 것을 안다. 내가 어떻게 그럴 수 있니? – Ryan

+1

-1'\ Q \ E' 수식어를 제거하라는 잘못된 조언. '$ string'에는 사용자 입력이 포함되어 있기 때문에 의도적으로 사용자 입력을 문자열 리터럴 대신 정규 표현식으로 해석하지 않으려면 메타 문자를 이스케이프하기 위해'\ Q \ E' 수정자를 사용해야합니다. –

2

일부 언어와 달리 Perl에서는 입력 연산자가 자동으로 후행 줄 바꿈을 제거하지 않습니다. 따라서 $string은 실제로는 "Clinton"이 아닌 "Clinton\n"입니다. 문제를 해결하려면 the chomp function을 사용하십시오.

$string = <>; 
chomp $string; 
print "You put $string\n"; 
+0

아의 완벽한 :

여기
my @lines = split(' ', $_); print MYFILE "$lines[0] $lines[1] $lines[2] $lines[3]\n"; 

분할의 문서는 다음과 같습니다 다음은 무엇을 할 수 있는지의 예입니다. 나는 3 가지 대답 모두를 합쳤다. 고마워요! – Ryan

+0

여러분을 환영합니다! 하지만 기록상, 스퀴지의 대답은 잘못되었습니다.'$ _ = ~'는 선택 사항입니다. (내 말은, 그가 "필자는"필자가 생각한 것 "이라고 썼다는 뜻이지만, 개인적으로는 동의하지 않는다.) 그리고 나는 당신이'\ Q'와'\ E'를 유지해야한다고 생각한다 : 그는 사용자가 특수 문자를 입력 할 가능성이있는 경우에만 필요하다고 말합니다. 항상 그렇습니다. 그래서 당신은 그것을 지켜야합니다. – ruakh

+0

$ _은 왜 선택적입니까? 미안해, 아직도 perl에 익숙하지 않아. – Ryan

0

또한 open의 3 인수 버전을 사용해야합니다. 또한 개방

open(my $LOG, '<', 'u_ex121011.log') or die "Unable to open file:$!\n"; 

http://perldoc.perl.org/functions/open.html

+0

이 질문에 대한 답변을 제공하지 않습니다. 비평하거나 저자의 설명을 요청하려면 게시물 아래에 의견을 남겨 둡니다. – dgw

+0

변경됨. 고맙습니다. – Ryan

관련 문제