Я думаю, что короткий ответ да, необходимо изучить Objective C.
Python и Ruby "соединяют работу мостом", но это не то, что Apple продвигает или использует себя. Несколько лет назад был мост Java к Какао, но это теперь удерживается от использования. Кто знает то, что произойдет с языками non-ObjC?
В любом случае, Objective C является довольно динамичным. Не в способе, которым Ruby/Python, возможно, но это, конечно, не как C++.
В ожидании разъяснений по поводу вопроса, я подумал, видя, что вы находитесь в каком-то учебном заведении и получаете задания, связанные с Perl, я решил, что сейчас самое лучшее время, чтобы познакомить вас с Moose и CPAN, вещи, которые вам действительно стоит использовать в реальном мире.
Он и его различные расширения сделают вашу жизнь проще и сделают объектно-ориентированный дизайн более простым и удобным в обслуживании.
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use Moose::Autobox;
use 5.010;
sub Moose::Autobox::SCALAR::sprintf {
my $self = shift;
sprintf( $self, @_ );
}
{
package Son;
use Moose;
use MooseX::Types::Moose qw( :all );
use MooseX::ClassAttribute;
use MooseX::Has::Sugar 0.0300;
use Moose::Autobox;
class_has 'Ancestry' => ( isa => HashRef, rw, default => sub { {} } );
class_has 'People' => ( isa => HashRef, rw, default => sub { {} } );
has 'name' => ( isa => Str, rw, required );
has 'father' => ( isa => Str, rw, required );
sub BUILD {
my $self = shift;
$self->Ancestry->{ $self->name } //= {};
$self->Ancestry->{ $self->father } //= {};
$self->People->{ $self->name } //= $self;
$self->Ancestry->{ $self->father }->{ $self->name } = $self->Ancestry->{ $self->name };
}
sub children {
my $self = shift;
$self->subtree->keys;
}
sub subtree {
my $self = shift;
$self->Ancestry->{ $self->name };
}
sub find_person {
my ( $self, $name ) = @_;
return $self->People->{$name};
}
sub visualise {
my $self = shift;
'<ul><li class="person">%s</li></ul>'->sprintf( $self->visualise_t );
}
sub visualise_t {
my $self = shift;
'%s <ul>%s</ul>'->sprintf(
$self->name,
$self->children->map(
sub {
'<li class="person">%s</li>'->sprintf( $self->find_person($_)->visualise_t );
}
)->join('')
);
}
__PACKAGE__->meta->make_immutable;
}
my @rows = ( [ "bill", "sam" ], [ "bob", "" ], [ "jack", "sam" ], [ "jone", "mike" ], [ "mike", "bob" ], [ "sam", "bob" ], );
for (@rows) {
Son->new(
father => $_->at(1),
name => $_->at(0),
);
}
<<'EOX'->sprintf( Son->find_person('bob')->visualise )->say;
<html>
<head>
<style>
li.person {
border: 1px solid #000;
padding: 4px;
margin: 3px;
background-color: rgba(0,0,0,0.05);
}
</style>
</head>
<body>
%s
</body>
</html>
EOX
Используйте GraphViz . Это намного проще, чем сделать снимок самостоятельно.
As much as I enjoyed learning from Kent Fredric's answer (see, I have barely written anything beyond simple exercises using Moose), I figure you might learn more by looking at a somewhat more traditional solution to the problem of displaying the data structure. It does not directly solve your question (I assume your question is based on a homework assignment). If the code proves to be helpful, I am sure your instructor would appreciate it if you cite any outside help you have received.
#!/usr/bin/perl
use strict;
use warnings;
my @rows = (
[ bill => 'sam' ],
[ bob => '' ],
[ jack => 'sam' ],
[ jone => 'mike' ],
[ mike => 'bob' ],
[ sam => 'bob' ],
[ jim => '' ],
[ ali => 'jim' ],
);
my %father_son;
for my $pair ( @rows ) {
push @{ $father_son{ $pair->[1] } }, $pair->[0];
}
for my $root ( @{ $father_son{''} } ) {
print_branch($root, 0);
}
sub print_branch {
my ($branch, $level) = @_;
print "\t" x $level, $branch, "\n";
if ( exists $father_son{$branch} ) {
for my $next_branch ( @{ $father_son{$branch} } ) {
print_branch($next_branch, $level + 1);
}
}
return;
}
__END__
Output:
C:\Temp> tkl
bob
mike
jone
sam
bill
jack
jim
ali