2010-07-20 5 views
1

질문 요약 :Perl을 사용하여 지정된 형식의 텍스트를 정규식으로 구문 분석하는 방법?

텍스트 파일을 Perl에서 두 개의 "해시"로 구문 분석하는 방법. 하나는 (X = Y) 부분에서 가져온 키 - 값 쌍을 저장하고 다른 부분은 (X : Y) 부분에서 가져옵니다.

1=9 
2=2 
3=1 
4=6 
2:1 
3:1 
4:1 
1:2 
1:3 
1:4 
3:4 
3:2 

두 파일은 한 파일에 저장되며 두 자리 사이의 기호 만 차이를 나타냅니다.

============================================== =================

나는 지난 학기 동안 Perl을 배우면서 약 30 시간을 보내고 "Perl 과제를"첫 번째, 임시, 추악한 "방식으로 끝내야합니다.

솔직히 말해서,이 섹션에 대한 내 결과가 7/10인데, 나는 이것이 만족스럽지 않다. 규칙적인 표현식을 사용하여 정규식을 사용하려고 애쓰는 나의 가난한 기억을 회상하기 때문이다. 이 :

1= (the last digit in your student ID,or one if this digit is zero) 
2= (the second last digit in your student ID,or one if this digit is zero) 
3= (the third last digit in your student ID, or one if this digit is zero) 
4= (the forth last digit in your student ID, or one if this digit is zero) 

2:1 
3:1 
4:1 
1:2 
1:3 
1:4 
2:3 (if the last digit in your student ID is between 0 and 4) OR 
    3:4 (if the last digit in your student ID is between 5 and 9) 
3:2 (if the second last digit in your student ID is between 0 and 4) OR 
    4:3 (if the second last digit in your student ID is between 5 and 9) 

An example of the above configuration file: if your student ID is 10926029, it has to be: 

1=9 
2=2 
3=1 
4=6 
2:1 
3:1 
4:1 
1:2 
1:3 
1:4 
3:4 
3:2 

할당이 단순화 알고리즘 페이지 랭크 (PageRank)의 계산에 관하여이었다 그래서 나는 5 분에서 그 부분에 대한 답 함께했다. 그러나, 시간을 쌓아 올리는 것은 텍스트 파싱 부분이었습니다.

텍스트 (= 페이지 랭크)의 첫 번째 부분은 페이지와 해당 pageranks이다.

번째 부분 (는 Fromnode : ToNode)는 두 페이지 간의 링크의 방향을 나타낸다. 더 나은 이해를 위해

, 내 웹 사이트로 이동하여 요구 사항 파일과 내 펄 스크립트를 확인하시기 바랍니다 here

그래서 나는 그것이 내가 얼마나 바보 볼 전혀 어렵지 않다라고 생각 스크립트의 엄청난 댓글이 나는 노 코멘트로 "결과 7/10을"아무 것도 없어하지만

: 내 솔루션 :(이 페이지에서 여전히 경우

, 나는 그래서 여기에이 질문을 왜 나를 정당화하자 유니에서.

나는 유니 (uni)를 배우기 위해 공부하고 있지 않다. 나는 혼자 학습하고있다.

그래서 Perl 전문가가이 문제를 해결하기위한 올바른 방향을 안내 할 수 있기를 바랍니다. 내 어리석은 해결책은 일종의 "일반"이었고 Java, C# 등에서도 작동 할 것입니다. Perl의 성격과는 거리가 멀다고 확신합니다.

그리고, 가능하면 내가 거기까지 "학습 펄 ==> 프로그래밍 펄 ==> 마스터 펄 '을 통해 갈 필요가 같은 날 솔루션의 수준을 알려 주시기 바랍니다 :) 어떤을위한

감사합니다 힌트 및 제안.

편집 1 :

나는 또 다른 질문은 게시하지만 당신이 무슨 뜻인지 꽤 많은 일들이 내 유니 :(

+2

나는 한 가지 진지한 제안을 가지고있다 : 교수님에게 가서 문제를 조금이라도 이야기하고 싶다고 말한다. 학년을 변경하려는 것이 아니라 물질을 더 잘 이해할 수 있다는 것을 분명히하십시오. _ 대부분의 선생님들은 그만큼 거절하고 있습니다. – Telemachus

+0

@ 텔레 마커스 :이 유니에서 수년간 공부 한 후에 나는 교수님을 쫓지 않는 한 이런 일은 일어나지 않을 것이라고 확신합니다. 직접적인 피드백이 필요합니다. 나는 그것이 다른 누군가에 의해 표시되었다는 것을 안다. 그들은 이것을 과거의 문제로 인식했을 것입니다. 나는이 병이 너무 심하다. 솔직히 말해서, 나는 그들이 더 나은 해결책을 보여줄 것이라고 생각하지 않습니다. ( –

+3

당신의 질문은 막을 수없는 것입니다. 당신은 무엇을 요구하고 있습니까? 나는 당신이 원하는 것을 알아 내는데 단지 45 분을 보내고 싶지 않습니다. 이상한 사이트에서 알려지지 않은 zip 파일을 다운로드하고 싶지 않은 경우 응답을 원할 경우 짧고 명확한 질문을 작성하고 약간의 코드를 제공하십시오 – daotoad

답변

3

갈 방법 등을 설명하는 here 닫은?정규식에는 기본적으로 세 개의 캡처 그룹 (()으로 표시)이 있습니다. 한 자리 숫자 다음에 = 또는 : (그 안에있는 모든 문자와 일치하는 문자 클래스 []을 래핑하는 캡처 그룹)과 그 다음에 다른 한 자리가 있어야합니다.

my (%assign, %colon); 

while (<DATA>) { 
    chomp;      
    my ($l, $c, $r) = $_ =~ m/(\d)([=:])(\d)/; 

    if (q{=} eq $c) { $assign{$l} = $r; } 
    elsif (q{:} eq $c) { $colon{$l} = $r; } 
}   

__DATA__ 
1=9 
2=2 
3=1 
4=6 
2:1 
3:1 
4:1 
1:2 
1:3 
1:4 
3:4 
3:2 

가능한 경우 권장 사항은 Mastering Regular Expressions입니다. 아주 ... 철저합니다.

+0

그건 내가 한 일보다 절대적으로 좋습니다. 동일한 프로세스에서 구문 분석 및 데이터 유효성 검사를 시도하고 있었고 지저분한 스크립트로 끝났습니다. 또한, 권장 도서에 대한 행크스. –

+0

나는 책을 추천 할 것이고, 나는 직장에서 그것을 사용했고, 많은 도움을 주었다. 나는 항상 정규 표현식을 배우고 싶다. 데이터 파싱에 도움이된다. – onaclov2000

+0

코드는 1에서 2 사이의 링크를 삭제하고 1에서 4까지의 링크 만 유지합니다. 간단한 해시는 여러 값을 단일 키와 연결할 수 없습니다. – daotoad

1

데이터 파일에 대한 제한을 확인하지 않으려는 경우이 데이터를 매우 쉽게 구문 분석 할 수 있습니다. 주요 문제는 데이터를 저장할 적절한 구조를 선택하는 데 있습니다.

use strict; 
use warnings; 

use IO::File; 

my $file_path = shift; # Take file from command line 

my %page_rank; 
my %links; 

my $fh = IO::File->new($file_path, '<') 
    or die "Error opening $file_path - $!\n"; 

while (my $line = $fh->readline) { 
    chomp $line; 

    next unless $line =~ /^(\d+)([=:])(\d+)$/; # skip invalid lines 

    my $page  = $1; 
    my $delimiter = $2; 
    my $value  = $3; 


    if($delimiter eq '=') { 

     $page_rank{$page} = $value; 
    } 
    elsif($delimiter eq ':') { 

     $links{$page} = [] unless exists $links{$page}; 

     push @{ $links{$page} }, $value; 
    } 

} 

use Data::Dumper; 
print Dumper \%page_rank; 
print Dumper \%links; 

이 코드가 Pedro Silva와 다른 주된 방식은 나의 것이 더 장황하고 한 페이지에서 여러 링크를 제대로 처리한다는 것입니다. 예를 들어, 내 코드는 1 페이지의 링크에 대한 모든 값을 보존합니다. Pedro의 코드는 마지막을 제외한 모든 값을 버립니다.

+0

@daotoad : 나는 모듈 사용을 좋아합니다. 내 원래의 코드에서 그 중 하나를 사용하는 것이 허용되지 않는 것은 고통 스럽습니다 ... –

+0

IO :: 파일은 핵심 모듈이며'<> '연산자를 통해 가독성을 높이기 위해 사용했습니다.'open'과'<>'로는 얻을 수 없었던 추가 기능이 없으며 IMO 구문이 약간 깔끔합니다. – daotoad

관련 문제