Moose基础:打开文件和解析

时间:2011-02-17 09:57:11

标签: perl oop moose

我是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

4 个答案:

答案 0 :(得分:3)

打开文件与Moose没有任何关系。但是,如果您正在寻找处理文件的现有接口,您应该查看Path::Class::File,它是一个包含文件名的对象,并为您提供许多方法来处理它所代表的文件。在属性中使用此类作为Moose类型约束是很常见的:

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对象。

答案 1 :(得分:1)

您可能想尝试在Moose::Cookbook中尝试模拟示例。

老实说,你自己的例子并不是与OOP有关。

如果您的意思是使用OOP版本的IO,您可以轻松地执行此操作(使用IO::Handle)模块,但该模块不是基于Moose的。

如果您的意思是要将上面的文件代码包装到基于Moose的模块中,您当然可以但需要澄清所需的(与Moose无关的)OOP设计。例如。你寻求的实例变量是什么?方法

答案 2 :(得分: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');

答案 3 :(得分: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>;