#!/usr/bin/perl use strict; use warnings; package Foo::Parse; sub new { my ($self, $name, $action)=@_; bless { _name => $name, _action => $action }, $self; } sub parse { my $self=shift; $self->{_action}->($self, @_); } sub warn { my ($self,@msg)=@_; warn "[$self->{_name}] @msg\n"; } package main; my $fp=Foo::Parse->new( 'FooParser', sub { my $self=shift; local $_=shift; s/^\w+:// or $self->warn("something wrong!"); split /,/; } ); $fp->parse($_) while <>; __END__