我是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
答案 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 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>;