2011-02-17 58 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>;