2012-06-21 2 views
0

그래서 누군가가 내 이유는 다음 코드를 실행할 때 설명 할 수있다, 그것은 ".link/output"줄의 처음과 끝에 모두 인쇄합니다. 나는 줄의 끝에서만 인쇄하기 위해 노력했다. 이견있는 사람?왜이 인쇄가 perl에서 두 번입니까?

#!/usr/local/bin/perl 

use warnings; 
use strict; 
my $logfiles = $ARGV[0]; #file containing the list of all the log file names 

my @logf =(); 
my $i; 

open (F2, "<", $logfiles); 

while(<F2>){ 
    @logf = $_; 
    foreach $i(@logf){ 
     print $_.".link/output"; 

    } 
} 
close F2; 

그래서 예를 들어, 내가에서 읽고 있어요 파일 인 경우 :

cat 
dog 

내가보고 싶어 :

cat.link/output 
dog.link/output 

을하지만 점점 오전 isntead :

.link/outputcat.link/output 
.link/outputdog.link/output 

아무도 나에게 이유를 설명해 줄 수 없었습니다. 무슨 일이 일어나고 있는지, 어떻게 고칠 수 있습니까? 고맙습니다.

+3

목록에 빈 요소가 있다고 생각합니다. 빈 문자열에 ".link/output"을 연결합니다. – PinkElephantsOnParade

+0

'while'과'foreach' 루프가 예상 횟수만큼 실행되고 있는지 확인할 수 있습니까? –

+1

왜 배열에 스칼라를 할당하고 배열을 반복하려고합니까? 하나의 값만 포함 할 수 있으므로 아무런 루프도 필요하지 않습니다. 그리고 루프에서, 당신은 루프 변수'$ i'를 사용하지 않습니다, 당신은 어쨌든'$ _'을 사용합니다. '@logf = $ _; $ i (@logf) {인쇄 $ _. ...}'이 모든 것은 완전히 중복됩니다. 당신은 단지'print $ _ .link/output \ n "이라고 쓸 수도 있습니다. TLP

답변

5

목록 시작 부분에 빈 요소가 있습니다. 간단하게 shift @logf

+0

그 행은 어디에 두어야합니까? – user1440061

+0

인쇄하기 전에 분명히. – m0skit0

+1

'@logf'를 할당 한 직후에 제안합니다. 또한 좋은 코딩 방법이 좋기 때문에 루프에 로컬로 만듭니다. – HaloWebMaster

3

나는 무엇을 @logf가 표시되지 않습니다. 이 작업을 수행 할 수 없습니다 :

#!/usr/bin/env perl 

use warnings; 
use strict; 
my $logfiles = $ARGV[0]; #file containing the list of all the log file names 

#open(my $f2, "<", $logfiles); 

# FOR TESTING, use above in your code 
my $f2 = \*DATA; 
# =========== 

while(<$f2>){ 
     chomp; 
     print "$_.link/output\n"; 
} 
__DATA__ 
cat 
dog 
+2

+1'@logf'는 중복 적이라고 말해야 하겠지만 분명히 있기 때문에. – TLP

+0

내 코드를 훨씬 더 깨끗하게 만드는 데 도움이되었습니다. 정말 고마워요! – user1440061

+0

나는 (문제를 일으키는 것 이외에) 많이하지 않는다는 것을 알았지 만, OP에 "오, 내가 Y가 필요하다"고 말할 기회를 원했다. –

관련 문제