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
anduse warnings
at the start of your program - Use lexical filehandles, the three-argument form of
open
and always check the success of everyopen
call
use strict;
use warnings;
open my $fh, '<', 'input.txt' or die $!;
/(\S+)\s+(\d+)/ and print "$1-$2\n" while <$fh>;
精彩评论