2011-02-17 60 views
1

我是Moose和OOP的新手,希望能夠使用Moose來解決非常基本的文件處理和解析需求的一些指導。我熟悉Perl,並想開始使用OOP。駝鹿的基本知識:打開文件並解析

本質上,我想要做的就是打開一個文本文件,解析它,然後打印到stdout

例如使用標準的Perl

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

其中input.txt的是

ABC 20 
DEF 10 
GHI 50 
+5

@ user621092使用3個參數打開,如[文檔中的第一個示例](http://perldoc.perl.org/functions/open.html)所示,這與Moose有什麼關係?我對解析需求的含義感到困惑。 – xenoterracide 2011-02-17 10:16:40

回答

1

你可能想嘗試Moose::Cookbook效仿的例子。

說實話,你自己的例子並不是真的與OOP有關。

如果你的意思是使用IO的OOP版本,你可以很容易地做到這一點(使用IO::Handle)模塊,但該模塊不是基於Moose的。

如果你的意思是你想把上面的文件代碼包裝到基於Moose的模塊中,你當然可以,但是你需要澄清你想要的(與Moose無關的)OOP設計。例如。你尋求什麼樣的實例變量?方法?

+0

我在找的是一個我可以調用的函數,它將根據輸入參數來解析文件,例如。我的$ v = CLASS-> new(); $ V-> parseLog($日誌文件, 'MOC', '2011-02-15', 'ABC');並從$ logfile返回'MOC','2011-02-15','ABC'的數據。 – user621092 2011-02-17 13:20:41

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 2011-02-17 13:33:08

3

以任何方式打開文件並不真正與Moose有關。但是,如果你正在尋找現有的接口來處理文件,你應該看看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方法,因此它需要接收一條線從文件作爲參數CODEREF,處理文件內容以更模塊化的方式。當然,這一切都取決於您需要執行的程序。

或者,如果你喜歡MooseX::Types,你可以這樣做:

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

這將讓你通過文件名的屬性,它會自動膨脹成Path::Class::File對象內部。

0

這是一個非常簡單的Perl程序,使用Moose只會使其複雜化。

之前,你的進步在你的程序開始編寫面向對象的Perl

  • 始終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>;