## re-formatted for ease of viewing $outstr .= $_ foreach (map $self->_jilout($_), @{%$self}{@{$self->{_fields_in_seq}}}); #### @$self{ @{$self->{_fields_in_seq}} }; #### package rincewind; sub new { bless {}, shift } sub jil { my ($self) = @_; my $outstr = $self->_jilout('insert_job') . $self->_jilout('job_type'); $outstr .= $_ foreach map $self->_jilout($_), @$self{ @{$self->{_fields_in_seq}} }; $outstr; } sub _jilout { my ($self,$attr) = @_; return '' if !exists $self->{$attr} or !defined $self->{$attr}; "$attr: ".$self->{$attr}."\n"; } package main; use strict; use warnings; use Data::Dumper; my $o = rincewind->new; @$o{qw/insert_job job_type/} = qw[ 50 daemon ]; my @flds = qw[ foo bar baz quux ]; @$o{ @flds } = reverse @flds; @{ $o->{_fields_in_seq} } = @flds; print $o->jil, $/; exit 0; __output__ insert_job: 50 job_type: daemon quux: foo baz: bar bar: baz foo: quux