Основы Moose: открыть файл и разобрать - PullRequest
1 голос
/ 17 февраля 2011

Я новичок в Moose и ООП и хотел бы получить некоторые рекомендации по решению очень простого требования к обработке и анализу файлов с использованием Moose. Я знаком с Perl и хотел бы начать использовать ООП.

По сути, все, что я хочу сделать, - это открыть текстовый файл, разобрать его и распечатать на stdout.

Например, используя стандартный Perl

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

где input.txt -

ABC 20
DEF 10
GHI 50

Ответы [ 4 ]

3 голосов
/ 17 февраля 2011

Открытие файлов на самом деле никак не связано с 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 голос
/ 17 февраля 2011

Возможно, вы захотите попробовать эмулировать примеры в Moose :: Cookbook .

Если честно, ваш собственный пример не имеет отношения к ООП.

Если вы имеете в виду использование ООП версии IO, вы можете легко сделать этот (используйте IO::Handle) модуль, но этот модуль не основан на Moose.

Если вы хотите заключить код файла выше в модуль на основе Moose, вы, конечно, можете, но вам нужно уточнить (независимый от Moose) дизайн ООП, который вы хотите. Например. Какие переменные экземпляра вы ищете? методы?

0 голосов
/ 06 июля 2012

Это очень простая Perl-программа, и использование Moose только усложнит ее.

Прежде чем вы приступите к написанию объектно-ориентированного Perl

  • Всегда use strict и use warnings в начале вашей программы
  • Используйте лексические файловые дескрипторы, форму с тремя аргументами open и всегда , проверяйте успешность каждого open вызова
use strict;
use warnings;

open my $fh, '<', 'input.txt' or die $!;

/(\S+)\s+(\d+)/ and print "$1-$2\n" while <$fh>;
0 голосов
/ 17 февраля 2011

Судя по комментарию под ответом ДВК, вы можете спросить что-то подобное?

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');
...