2012-10-16 5 views
3

나는 Perl에 100 % 새로 소개되었지만 PHP 지식이있다. @url 변수를 가져 와서 .txt 파일로 저장하는 빠른 스크립트를 만들려고합니다. 내가 겪고있는 문제는 그것이 성가시다 루프를 통해 실행될 때마다 URL을 다시 저장한다는 것입니다. 그래서 루프가 실행되면, 다음과 같이 보일 것입니다. 나는 그것을 같이하고 싶은 무엇루프가 반복되고있는 동안

url1.com 
url1.com url2.com 
url1.com url2.com url3.com 

은 평범하고 단순하다 :

url1.com 
url2.com 
url3.com 

가 여기 내 코드입니다. 누구든지 도울 수 있다면, 나는 그렇게 많이 감사 할 것입니다!

#!/usr/bin/perl 
use strict; 
use warnings; 

my $file = "data.rdf.u8"; 
my @urls; 

open(my $fh, "<", $file) or die "Unable to open $file\n"; 

while (my $line = <$fh>) { 

    if ($line =~ m/<(?:ExternalPage about|link r:resource)="([^\"]+)"\/?>/) { 
     push @urls, $1; 
    } 

    open (FH, ">>my_urls.txt") or die "$!"; 
    print FH "@urls "; 
    close(FH); 
} 

close $fh; 
+6

'die' 예외가있는'open'에서 잘 수행되지만 * OS Error * 변수를 'die' 문자열에 통합하는 것이 매우 유용합니다. 실패 이유를 설명하십시오. 또한 'die'문자열의 끝에서 개행을 생략하면 Perl은 컨텍스트 정보를 추가하여 어떤 예외적 인 소스 파일에서 – Borodin

답변

8

인쇄물이 while 루프 안에 있습니다. 루프 밖에서 인쇄물을 이동하려는 것 같습니다.

아니면 각 라인을 통해 이동로, 각 URL을 인쇄 아래로 루프에 "내 @urls"의 선언을 이동하려는 경우, 다음 각 줄을 다시 얻을 것이다

4

해서는 안이 부분 :

open (FH, ">>my_urls.txt") or die "$!"; 
print FH "@urls "; 
close(FH); 

... while 루프 외부에 배치 하시겠습니까? while 안에는 아무런 의미가 없습니다. @urls이 분명히 불완전합니다.

두 개의 정규식 관련 부업 : 먼저 m 연산자를 사용하면 다른 구분 기호 세트를 선택할 수 있으므로 도망 가지 않아도됩니다 / 기호; 두 번째로 문자 클래스 정의 내에서 " 기호를 벗어날 필요가 없습니다. 사실,이 문자를 구분 기호로 선택하지 않으면 정규 표현식에서 이스케이프 처리하지 않아도됩니다.)

그래서 당신의 정규식은 다음과 같이 보일 수 있습니다 :

$line =~ m#<(?:ExternalPage about|link r:resource)="([^"]+)"/?># 
2

당신은 다른 곳 @urls 배열을 필요합니까?

#!/usr/bin/perl 
use strict; 
use warnings; 

my $file = "data.rdf.u8"; 
my @urls; 

open(my $fh, "<", $file) or die "Unable to open $file\n"; 
open (FH, ">>my_urls.txt") or die "$!"; 
while (my $line = <$fh>) { 
    if ($line =~ m/<(?:ExternalPage about|link r:resource)="([^\"]+)"\/?>/) { 

     print FH $1; 

    } 



} 
close(FH); 
close $fh; 
+2

+1을 사용하여 합리적인 방법을 설명하지만 +1을 사용하여 불일치를 수정하는 것이 좋습니다 'FH','$ fh'와 같이) - 지금 당신의 코드입니다.) – raina77ow

+0

맞습니다. 가능한 한 적은 수의 수정을 추가하고 싶습니다. –

+0

Simple clean code를 주셔서 감사합니다. 내가 지금 가지고있는 유일한 문제는 지금은 url1url2url3로 최대 인쇄 때문에이 URL1 URL2 URL3 로 출력합니다 그래서 빈 공간을 남겨 않는 방법이다. $ 1 다음에 \ n을 추가합니까? 미안하지만, 필자는 말 그대로 Perl에 새로운 브랜드입니다. – user1701252

관련 문제