帮助使用perl dbi并创建独特的输出文件

时间:2011-02-25 17:28:11

标签: perl

我在打印给定文件的正确记录数时遇到问题。我的测试脚本只是将一个perl dbi连接到一个mysql数据库并给出一个表列表,每个表提取(1)记录。

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

到目前为止,我能够生成100个文件,但是有超过(1)个记录。文件中最多有280条记录。具有讽刺意味的是,我为每条记录生成一个唯一的密钥,密钥是唯一的。

如果我将$data打印到单个文件(在foreach循环之外),我会得到预期的结果,但只能在一个文件中。例如,一个文件有100条记录,但我想为每个文件创建一个文件。

我似乎在打开文件句柄并正确输出时遇到问题?或者我的代码出了别的问题。

有人可以告诉我如何正确设置吗?告诉我一些实现这一目标的最佳实践? 谢谢。

这是我的测试代码:

# Get list of table
my @tblist = qx(mysql -u foo-bar -ppassw0rd --database $dbsrc -h $node --port 3306 -ss -e "show tables");

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

   #Testing to 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;

   #Testing to create file
   print $out_fh $data;
   close $out_fh or die "Failed to close file: $!";
};
#print $data; #Here if I uncomment and output to a single file, I can see the correct number of record, but its in (1) file

1 个答案:

答案 0 :(得分:1)

您需要在每个$data循环迭代(外循环)上清除$tblist

在这一行中:$data = $data. "__pk__^A$id^E1^A$...每次迭代都会在旧数据的TOP上追加新表中的数据,并且它会在不同表之间的代码中保留,因为$data变量的作用域是OUTSIDE外部循环及其值永远不会在其内部重置。

最简单的解决方案是在外部($data)循环中声明$tblist

foreach my $tblist (@tblist) {
    my $data = '';

您可以在外循环之前继续声明它,并在循环开始时简单地指定它""值,但没有意义 - 通常没有合理的理由知道$data的值循环结束后,在这样的循环中,所以不需要它在比循环块更大的范围内。