开发者

Moose basics: open file and parse

开发者 https://www.devze.com 2023-02-11 20:32 出处:网络
I am new to Moose and OOP and would like some guidance on solving a very basic file handling and parsing requirement usi开发者_JAVA技巧ng Moose. I am familiar with Perl, and would like to start using

I am new to Moose and OOP and would like some guidance on solving a very basic file handling and parsing requirement usi开发者_JAVA技巧ng Moose. I am familiar with Perl, and would like to start using OOP.

Essentially, all that I want to do is open a text file, parse it, and print to stdout.

For instance using standard Perl

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

where input.txt is

ABC 20
DEF 10
GHI 50


Opening files doesn't really relate to Moose in any way. However, if you are looking for existing interfaces to deal with files, you should take a look at Path::Class::File, which is an object that will contain a filename and provide you many methods for dealing with the file it represents. It is quite common to use this class as a Moose type constraint in an attribute:

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;

You could also modify the process_file method so it takes a coderef which receives one line from the file as an argument, to process the file contents in a more modular way. It all depends on what you need your program to do, of course.

Alternatively, if you like MooseX::Types, you can do:

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

This will let you pass a filename to the attribute and it will automatically inflate into a Path::Class::File object internally.


You might want to try emulating examples in Moose::Cookbook.

To be honest, your own example is not really OOP related.

If you mean using OOP version of IO, you can easily do that (use IO::Handle) module, but that module is not Moose based.

If you mean you want to wrap the file code above into a Moose-based module, you certainly can but you need to clarify the (Moose-independent) OOP design you want. E.g. what are the instance variables you seek? methods?


Based on comment under DVK's answer, you might be asking for something like this?

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


This is a very simple Perl program and using Moose would only complicate it.

Before you progress to writing object-oriented Perl

  • Always use strict and use warnings at the start of your program
  • Use lexical filehandles, the three-argument form of open and always check the success of every open call
use strict;
use warnings;

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

/(\S+)\s+(\d+)/ and print "$1-$2\n" while <$fh>;
0

精彩评论

暂无评论...
验证码 换一张
取 消