package Man;
use strict;
use warnings;

sub new{
  my ($class,$param) = @_;
  my $self = bless {param=>$param},$class;
}

sub name{
  my ($self) = @_;
  return $self->{param}{name} || "";
}

sub friends{
  my ($self) = @_;
  return $self->{param}{friends} || []
}

sub hello{
  my $self = shift;
  printf qq{hello world!! my name is %s\n},$self->name;
}

sub bye{
  my $self = shift;
  foreach(@{$self->friends}){
    printf qq{good bye %s!!\n},$_;
  }
}

sub add_friend{
  my ($self,$friend) = @_;
  $self->{param}{friends},$friend;
}

1

というライブラリがあれば、

use Man;
my $fn7 = Man->new({
  name=>"fn7",
  friends=>[qw(fn1 fn2 fn3 fn4 fn5)],
});

$fn7->hello();
$fn7->bye();

という処理を行うことができる。利点は、処理をまとめてを外に出すことで、メインの処理内容がすっきりとした見通しになる。ちなみにオブジェクト指向で書くと、自然と外部にライブラリを作る習慣ができる。ただし、ライブラリpackage宣言とディレクトリの対応、そのディレクトリがライブラリサーチパスの中に入っていることを確認しておくべし。