Una de las mejores cosas para mí es el uso de Perl para la generación de código. Especialmente cuando se trata de otros idiomas. He escrito varios scripts pequeños para generar clases C++ y código Java.
Cuando era un neófito de Perl. Escribí este fragmento de código, que generó archivos de esquema basados en nuestra base de datos. Alrededor de 2 horas después descubrí que no necesitaba hacer esto para DBIx::Class. Este no es un gran código de Perl (no me votes por él. Es solo un ejemplo), pero generó exactamente 200 archivos de esquema para mí.
my @db = `mysql -u XXXXX -pXXXXX --skip-column-names -e "show databases;"`;
foreach my $db_name (@db) {
chomp($db_name);
my @tables = `mysql -u XXXXX -pXXXXX --skip-column-names -e "use $db_name; show tables;"`;
$_ =~ s/\n// foreach(@tables);
unless (-e "$db_name.pm") {
open(DBFILE, '>', "$db_name.pm");
print DBFILE "package mysql::schemes::$db_name;\n";
print DBFILE "use base qw/DBIx::Class::Schema/;\n\n";
print DBFILE '__PACKAGE__->load_classes(qw/' . join(' ', @tables) . "/);\n\n";
print DBFILE "1;";
close(DBFILE);
}
mkdir $db_name unless (-d $db_name or -e $db_name);
foreach my $table_name (@tables) {
my @columns = `mysql -u XXXX -pXXXX --skip-column-names -e "USE $db_name; desc \\\`$table_name\\\`;"`;
$_ =~ s/\n$// foreach(@columns);
my (@names, $primary_key);
foreach (@columns) {
my ($name, $type, $null, $key, $default) = split(/\t/, $_);
chomp($default);
push(@names, $name);
$primary_key = $name if($key ne '');
}
unless (-e "$db_name/$table_name.pm") {
open(TBFILE, '>', "$db_name/$table_name.pm");
print TBFILE "package mysql::schemes::" . $db_name . "::" . $table_name . ";\n";
print TBFILE "use base qw/DBIx::Class/;\n\n";
print TBFILE "__PACKAGE__->load_components(qw/PK::Auto Core/);\n";
print TBFILE "__PACKAGE__->table('$table_name');\n";
print TBFILE "__PACKAGE__->add_columns(qw/" . join(' ', @names) . "/;\n";
print TBFILE "__PACKAGE__->set_primary_key('$primary_key');\n\n" unless($primary_key eq '');
print TBFILE "1;";
close(TBFILE);
}
}
}
Francamente, me sorprendería si viera código Perl que no pareciera que alguien vomitó en la pantalla;) –
Kent, de forma gratuita para ver cualquiera de mis código en CPAN, entonces. –