2011-02-17 4 views
1

저는 Moose과 OOP를 처음 사용하며 Moose을 사용하여 매우 기본적인 파일 처리 및 구문 분석 요구 사항을 해결하기위한 몇 가지 지침을 원합니다. Perl에 익숙하며 OOP를 사용하기 시작했습니다.무스 기본 사항 : 파일 열기 및 구문 분석

필자가 원하는 것은 텍스트 파일을 열고 구문 분석 한 다음 stdout으로 인쇄하기 만하면됩니다. input.txt를 당신은 Moose::Cookbook에서 모방 예를 시도 할 수도

ABC 20 
DEF 10 
GHI 50 
+5

@ user621092 [docs의 첫 번째 예제] (http://perldoc.perl.org/functions/open.html)에서 볼 수있는 3 개의 인수를 사용하여 Moose와 어떤 관련이 있습니까? 구문 분석 요구 사항에 대해 혼란 스럽습니다. – xenoterracide

답변

1

입니다

open (FILE , input.txt); 
while (FILE) 
{ 
    if (/(\S+)\s+(\d+)/) 
    { 
    print "$1-$2"; 
    } 
} 

표준 펄

사용 예를 들어

.

사실 솔직히 말해서 자신의 예는 OOP와 관련이 없습니다.

OOP 버전의 IO를 사용하려는 경우 쉽게 (IO::Handle 사용) 모듈을 사용할 수 있지만 해당 모듈은 무스 기반이 아닙니다.

위의 파일 코드를 무스 기반 모듈로 랩핑하려는 경우 확실히 할 수 있지만 원하는 무스 독립형 디자인을 명확히해야합니다. 예 : 당신이 찾는 인스턴스 변수는 무엇입니까? 행동 양식?

+0

내가 찾고있는 함수는 입력 매개 변수를 기반으로 파일을 구문 분석 할 수있는 함수입니다. my $ v = CLASS-> new(); $ v-> parseLog ($ logfile, 'MOC', '2011-02-15', 'ABC'); $ logfile에서 'MOC', '2011-02-15', 'ABC'에 대한 데이터를 반환합니다. – user621092

0

DVK의 답변에 대한 의견을 기반으로 다음과 같은 질문을 할 수 있습니다.

package CORDx; 
use Moose; 
use Carp; 

sub parse_log { 
    my ($self,$input_name, $whatever) = @_; 
    open my $fh, "<", $input_name 
     or croak "\"$input_name\" not found"; 

    while(<$fh>) { 
     if(/(\S+)\s+(\d+)/) { 
      print "$1-$2"; 
     } 
    } 
} 


package main; 
use CORDx; 

my $cordr = CORDx->new(); 
$cordr->parse_log('input.txt'); 
+0

고맙습니다. 감사합니다 ... 간단합니까? 위의 무스를 처음 접하는 누군가는 의미가 있으며 같은 시간에 많은 시간을 보냅니다. – user621092

+1

@bvr - 무스 특정 부분은 어디에 있습니까? 또는 나는 무엇인가 놓치고 있냐? – DVK

+0

@DVK :'Use Moose;'따라서 무스! – CanSpice

3

파일 열기는 실제로 어떤 방식 으로든 무스와 관련이 없습니다. 그러나 파일을 처리 할 기존 인터페이스를 찾으려면 Path::Class::File을 살펴보아야합니다. 은 파일 이름을 포함하고 해당 파일을 처리하는 여러 가지 방법을 제공하는 개체입니다.

package MyApp::Foo; 

use Moose; 

has filename => (
    is => 'ro', isa => 'Path::Class::File', 
); 

sub process_file 
{ 
    my $this = shift; 

    if (-e $this->filename) 
    { 
     my $fh = $this->filename->openr; 
     while (my $line = <$fh>) 
     { 
      # process file, line by line... 
     } 
    } 
} 

package main; 

my $obj = MyApp::Foo->new(filename => '/home/me/foo.txt'); 
$obj->process_file; 

이 인수로 파일에서 한 줄을 수신 코드 참조 소요 그래서 당신은 또한 process_file 방법을 수정할 수는을 처리하기 : 속성에 무스 타입의 제약 조건으로이 클래스를 사용하는 것이 매우 일반적이다 더 모듈 방식으로 내용을 파일화하십시오. 그것은 모두 당신이 당신의 프로그램이 필요로하는 것에 달려 있습니다. 당신이 MooseX::Types을 좋아하는 경우에

또는, 당신은 할 수 있습니다 :

use MooseX::Types::Path::Class qw(Dir File); 
has file => (..., isa => File, coerce => 1, ...); 

이것은 당신이 속성에 파일 이름을 통과하게되며, 자동으로 내부적으로 Path::Class::File 객체로 팽창 할 것이다.

0

이것은 매우 간단한 Perl 프로그램이며 Moose을 사용하면 복잡 할뿐입니다.

를 사용하여 프로그램의 시작

  • 사용 어휘 파일 핸들을 항상 객체 지향 펄

    • use strictuse warnings을 쓰기로 진행하기 전에 세 가지 인수 open의 형태와 항상 확인 모든 성공은 open 전화
    use strict; 
    use warnings; 
    
    open my $fh, '<', 'input.txt' or die $!; 
    
    /(\S+)\s+(\d+)/ and print "$1-$2\n" while <$fh>;