2009-07-09 9 views
5

मुझे लगता है कि मुझे आवश्यकता है निम्न करने के लिए पर्ल में एक प्रोग्रामिंग काम है:मैं पर्ल के साथ एक पारिवारिक पेड़ कैसे बना सकता हूं? तालिका से डेटा</p></li> <li><p>भार:

  1. ने MySQL डेटाबेस में एक मेज बनाता है, और इसे में इन रिकॉर्ड सम्मिलित करता है कक्षा पुत्र के उदाहरणों की एक सरणी में।

  2. सरणी का उपयोग करके, पिता-पुत्र के पेड़ का प्रतिनिधित्व करने वाला HTML कोड बनाता है, और HTML कोड को STDOUT पर प्रिंट करता है। पेड़ को अच्छा दिखाना जरूरी नहीं है। कुछ इस तरह ठीक होगा:

tree http://i25.tinypic.com/314t177.png

मैं विचारों से बाहर चल रहा हूँ, कृपया मदद करते हैं। है मेरे कोड इस प्रकार है:

क्या सवाल यह है कि के रूप में स्पष्टीकरण का इंतजार करते हुए
#!/usr/bin/perl 

use strict; 
use Son; 
use CGI; 
use Data::Dumper; 
use DBI; 
my $q = new CGI; 

#DB connect vars 
my $user = "##"; 
my $pass = "##"; 
my $db = "##"; 
my $host = "localhost"; 

my $dsn = "DBI:mysql:database=$db;host=$host"; 

my $dbh = DBI->connect($dsn,$user,$pass); 
eval { $dbh->do("DROP TABLE sons") }; 
print "Drop failed: [email protected]\n" if [email protected]; 

$dbh->do("CREATE TABLE sons (son VARCHAR(30) PRIMARY KEY, father VARCHAR(30))"); 

my @rows = (["bill", "sam"], 
     ["bob", ""], 
     ["jack", "sam"], 
     ["jone", "mike"], 
     ["mike", "bob"], 
     ["sam", "bob"] 
); 

for my $i (0 .. $#rows) { 
    $dbh->do("INSERT INTO sons (son, father) VALUES (?,?)", {}, $rows[$i][0], $rows[$i][1]); 
} 

our @sons_array; 
my $sth = $dbh->prepare("SELECT * FROM sons"); 
$sth->execute(); 
while (my $ref = $sth->fetchrow_hashref()) { 
    $sons_array[++$#sons_array] = Son->new($ref->{'son'}, $ref->{'father'}); 
} 
$sth->finish(); 
$dbh->disconnect(); 


print $q->header("text/html"),$q->start_html("Perl CGI"); 
print "\n\n"; 
constructFamilyTree(@sons_array, ''); 
print $q->end_html; 

sub constructFamilyTree { 
    my @sons_array = @_[0..$#_ -1]; 
    my $print_father; 
    my $print_son; 
    my $print_relation; 
    my $current_parent = @_[$#_]; 
    my @new_sons_array; 
    my @new_siblings; 

    #print $current_parent."\n"; 
    foreach my $item (@sons_array){ 
     if(!$item->{'son'} || $item->{'son'} eq $item->{'father'}) { # == ($item->{'son'} eq '') 
      print "\n List contains bad data\n"; 
      return 0; 
     } 

     if($item->{'father'} eq $current_parent) { 
      my $temp_print_relation; 
      foreach my $child (@sons_array) { 
       if($child->{'father'} eq $item->{'son'}) { 
        if(!$temp_print_relation) { 
         $temp_print_relation .= ' |'; 
        } 
        else { 
         $temp_print_relation .= '-----|'; 
        } 
       } 
      } 
      $print_relation .= $temp_print_relation." "; 
      $print_son .= '('.$item->{'son'}.') '; 
      @new_siblings[++$#new_siblings] = $item; 
      $print_father = $item->{'father'}; 
     } 
     else { 
      $new_sons_array[++$#new_sons_array] = $item; 
     } 
    } 

    print $print_son. "\n". $print_relation."\n"; 
    #print $print_father."\n"; 
    #print $print_relation . "\n". $print_son; 
    foreach my $item (@new_siblings) { 
     constructFamilyTree(@new_sons_array, $item->{'son'}); 
    } 
} 


perl module: 
#File Son.pm, module for class Son 

package Son; 

sub new { 
    my($class, $son, $father) = @_; 
    my $self = {'son' => $son, 
       'father' => $father}; 

    bless $self, $class; 
    return $self; 
} 

1; 
+4

"विचारों से बाहर निकलना", वास्तव में क्या विचार है? यहां कोई सवाल नहीं है, बस आपका असाइनमेंट, और "यहां, मेरे लिए यह करें"। –

+0

आपका प्रश्न वास्तव में CGI या MySQL के बारे में नहीं है। यह उचित डेटा संरचना को चुनने और प्रदर्शित करने के बारे में है। आपके कोड में कार्य के लिए बहुत अधिक आवश्यक विवरण शामिल हैं। –

+0

बस सोच रहा है कि मैं पूरी तरह से बंद या सही रास्ते पर हूं। क्षमा करें/धन्यवाद। –

उत्तर

5

, मैं देख लगा कि तुम सीखने संस्था के कुछ प्रकार पर्ल संबंधित कार्य दिया हो रही में हैं, मैं तर्क वहाँ लागू करने के लिए कोई बेहतर समय है आप मूस और सीपीएएन के लिए, वास्तविक दुनिया में वास्तव में उपयोग की जाने वाली चीजें हैं।

यह, और इसके विभिन्न एक्सटेंशन, आपके जीवन को आसान बना देंगे, और ऑब्जेक्ट ओरिएंटेड डिज़ाइन को अधिक सीधे आगे और बनाए रखने योग्य बनाता है।

#!/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 
+0

मैं बस सोच रहा था कि क्या किसी के पास कोई सुझाव था कि काम को बेहतर तरीके से कैसे पूरा किया जाए। मैं हाथ से नहीं खोज रहा था। मूस और सीपीएएन सबक के लिए धन्यवाद, यद्यपि! मैं perl के लिए नया हूँ और यह जानने के लिए बेहद उपयोगी है कि सबसे अच्छी असली दुनिया विधि क्या है। एक बार फिर धन्यवाद। –

1

जितना मैं Kent Fredric's answer (देखें, मैं मुश्किल से सरल मूस का उपयोग कर अभ्यास परे कुछ भी लिखा है), मैं समझ आप प्रदर्शित करने में समस्या का कुछ हद तक अधिक परंपरागत समाधान को देखकर अधिक सीख सकते हैं से सीखने का आनंद लिया डेटा संरचना। यह सीधे आपके प्रश्न को हल नहीं करता है (मुझे लगता है कि आपका प्रश्न होमवर्क असाइनमेंट पर आधारित है)। यदि कोड सहायक साबित होता है, तो मुझे यकीन है कि यदि आप किसी भी बाहरी सहायता को प्राप्त करते हैं तो आपका प्रशिक्षक इसकी सराहना करेगा।

#!/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__ 

आउटपुट:

C:\Temp> tkl 
bob 
     mike 
       jone 
     sam 
       bill 
       jack 
jim 
     ali 
+0

ऐसा लगता है कि किसी व्यक्ति के लिए केवल perl सीखना (खुद की तरह) समझना सबसे आसान लगता है। हालांकि, मैंने कल रात एक जवाब देने में कामयाब रहा, जिसने मेरी समस्या तय की। यह मेरी समस्या का एक और अधिक सरल जवाब भी है। धन्यवाद! मैं इस उदाहरण से सीखूंगा! –

3

उपयोग GraphViz। तस्वीर खुद को बनाने से बहुत आसान है।

संबंधित मुद्दे