Tôi có một nhiệm vụ lập trình trong Perl đòi hỏi tôi phải làm như sau:Làm thế nào tôi có thể xây dựng một cây gia đình với Perl?
Tạo một bảng trong một cơ sở dữ liệu mySQL, và chèn những hồ sơ này vào nó:
tải dữ liệu từ bảng vào một loạt các trường hợp của lớp Son.
Sử dụng mảng, tạo ra HTML code đại diện cho một cây cha-con trai, và in mã html để STDOUT. Nó không cần thiết để làm cho cây trông tốt. Một cái gì đó như thế này sẽ là tốt:
tree http://i25.tinypic.com/314t177.png
Tôi đang chạy ra khỏi ý tưởng, xin vui lòng giúp đỡ. Mã của tôi là như sau:
#!/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;
"Chạy ra khỏi ý tưởng", ý tưởng cho những gì chính xác? không có câu hỏi ở đây, chỉ là nhiệm vụ của bạn, và một "ở đây, hãy làm điều đó cho tôi". –
Câu hỏi của bạn thực sự không phải về CGI hoặc MySQL. Đó là về việc lựa chọn và hiển thị một cấu trúc dữ liệu thích hợp. Mã của bạn bao gồm quá nhiều chi tiết thừa cho nhiệm vụ trong tầm tay. –
Chỉ cần tự hỏi nếu tôi hoàn toàn tắt hoặc đi đúng hướng. Xin lỗi/Cảm ơn. –