perl-帮助重新编写代码,包括子例程的使用

perl-帮助重新编写代码,包括子例程的使用,perl,Perl,我的测试脚本只需将perl dbi连接到mysql数据库,并给出一个表列表,然后为每个表提取(1)条记录 对于我列出的每个表,我还希望将(1)条记录打印到它自己的文件中。例如,如果我有一个包含100个表的列表,我应该期望有100个uniques文件,每个文件有(1)条记录 到目前为止,代码仍然有效,但我对创建一个子例程感兴趣,称之为create_file,用于处理#create file 我不熟悉编写子例程,如果可能的话,需要帮助实现。 我不确定如何称呼构建数据的部分$data='' 有人能告诉

我的测试脚本只需将perl dbi连接到mysql数据库,并给出一个表列表,然后为每个表提取(1)条记录

对于我列出的每个表,我还希望将(1)条记录打印到它自己的文件中。例如,如果我有一个包含100个表的列表,我应该期望有100个uniques文件,每个文件有(1)条记录

到目前为止,代码仍然有效,但我对创建一个子例程感兴趣,称之为create_file,用于处理
#create file

我不熟悉编写子例程,如果可能的话,需要帮助实现。 我不确定如何称呼构建数据的部分<代码>$data=''

有人能告诉我做这件事的好方法吗?谢谢你的帮助

代码:

除非您确实需要为执行的每个语句连接到数据库,否则请在操作之间保持数据库的打开状态


除非您真的需要为执行的每个语句连接到数据库,否则请在操作之间保持数据库的打开状态。

您可以从中使用
写入文件,而不是创建自己的
创建\u文件。

它将打开/关闭/冲模/打印抽象出来。

您可以从中使用
write\u文件,而不是创建自己的
create\u文件。

它将打开/关闭/冲模/打印抽象出来。

没错,我不需要每次都为每个tbl连接。一个持久连接是提取信息所需的全部id。谢谢。@cjd143SD:您可能会发现DBI中有一种方法可以直接获取表名列表,这将避免
qx()
操作:
my@tables=$dbh->tables?不确定fetchrow\u数组上出现错误的原因失败。DBD::mysql::st execute失败:您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以了解在“1限制1”附近使用的正确语法。我认为sql很好。它以前工作过。@cjd143SD:我想
chomp
正在折磨我们-函数调用上下文为它提供了列表上下文而不是标量上下文。我会更新…好的,我不需要每次连接每个tbl。一个持久连接是提取信息所需的全部id。谢谢。@cjd143SD:您可能会发现DBI中有一种方法可以直接获取表名列表,这将避免
qx()
操作:
my@tables=$dbh->tables?不确定fetchrow\u数组上出现错误的原因失败。DBD::mysql::st execute失败:您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以了解在“1限制1”附近使用的正确语法。我认为sql很好。它以前工作过。@cjd143SD:我想
chomp
正在折磨我们-函数调用上下文为它提供了列表上下文而不是标量上下文。我会更新。。。
# Get list of tables
my @tblist = qx(mysql -u foo-bar -ppassw0rd --database $dbsrc -h $node --port 3306 -ss -e "show tables");

# Data output
    foreach my $tblist (@tblist)
    {
       my $data = '';
       chomp $tblist;

       #Create file
       my $out_file = "/home/$node-$tblist.$dt.dat";
       open (my $out_fh, '>', $out_file) or die "cannot create $out_file: $!";

       my $dbh = DBI->connect("DBI:mysql:database=$dbsrc;host=$node;port=3306",'foo-bar','passw0rd');
       my $sth = $dbh->prepare("SELECT UUID(), '$node', ab, cd, ef, gh, hi FROM $tblist limit 1");
       $sth->execute();
             while (my($id, $nd,$ab,$cd,$ef,$gh,$hi) = $sth->fetchrow_array() ) {
             $data = $data. "__pk__^A$id^E1^A$nd^E2^A$ab^E3^A$cd^E4^A$ef^E5^A$gh^E6^A$hi^E7^D";
             }
             $sth->finish;
             $dbh->disconnect;

       #Create file
       print $out_fh $data;
       close $out_fh or die "Failed to close file: $!";
    };
my $dt = "2011-02-25";
my $dbsrc = "...";
my $node = "...";

# Get list of tables
my @tblist = qx(mysql -u foo-bar -ppassw0rd --database $dbsrc -h $node --port 3306 -ss -e "show tables");
my $dbh = DBI->connect("DBI:mysql:database=$dbsrc;host=$node;port=3306",'foo-bar','passw0rd');
foreach my $tblist (@tblist)
{
   # This breaks - chomp is given a list-context
   #extract_data($dbh, chomp($tblist));
   chomp $tblist;
   extract_data($dbh, $tblist);
};
$dbh->disconnect;

sub extract_table
{
     my($dbh, $tblist) = @_;

     my $out_file = "/home/$node-$tblist.$dt.dat";
     open (my $out_fh, '>', $out_file) or die "cannot create $out_file: $!";

     my $sth = $dbh->prepare("SELECT UUID(), '$node', ab, cd, ef, gh, hi FROM $tblist limit 1");
     $sth->execute();
     while (my($id, $nd,$ab,$cd,$ef,$gh,$hi) = $sth->fetchrow_array() ) {
         print $out_fh "__pk__^A$id^E1^A$nd^E2^A$ab^E3^A$cd^E4^A$ef^E5^A$gh^E6^A$hi^E7^D";
     }
     $sth->finish;

     close $out_fh or die "Failed to close file: $!";
};