помогите с использованием Perl DBI и создания уникальных выходных файлов - PullRequest
0 голосов
/ 25 февраля 2011

У меня проблема с распечаткой правильного количества записей для данного файла.Мой тестовый скрипт просто устанавливает соединение 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 Ответ

1 голос
/ 25 февраля 2011

Необходимо очищать $data на каждой итерации цикла $tblist (внешний цикл).

В этой строке: $data = $data. "__pk__^A$id^E1^A$... вы добавляете данные из новой таблицы каждую итерацию в ТОП старых данных, и они сохраняются в вашем коде между различными таблицами, поскольку переменная $data находится вне ВНЕШНЕГО цикла и его значение никогда не будет сброшено внутри него.

Самое простое решение - объявить $data внутри внешнего ($tblist) цикла:

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

Вы можете продолжать объявлять его перед внешним циклом и просто присвоить ему значение "" в начале цикла, но в этом нет никакого смысла - обычно нет законной причины узнать значение $data в цикле, подобном это после завершения цикла, поэтому нет необходимости, чтобы он находился в области видимости больше, чем блок цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...