Perl - помочь переработать код, чтобы включить использование подпрограммы - PullRequest
1 голос
/ 25 февраля 2011

Мой тестовый скрипт просто устанавливает соединение perl dbi с базой данных mysql и дает список таблиц, извлекает (1) запись на таблицу.

Для каждой таблицы, которую я перечисляю, я также хочу напечатать эту (1) запись в свой собственный файл. Например, если у меня есть список из 100 таблиц, я должен ожидать 100 уникальных файлов с (1) записью каждый.

Пока код работает, но я заинтересован в создании подпрограммы, назовите ее create_file для фрагментов кода, обрабатывающего это #Create file

Я не знаком с написанием подпрограмм, и мне нужна помощь в его реализации, если это возможно. Я не уверен, как бы я назвал ту часть, где создаются данные. $data='';

Может кто-нибудь показать мне хороший способ сделать это? Спасибо за вашу помощь.

Код:

# 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: $!";
    };

Ответы [ 2 ]

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

Вместо создания собственного create_file, вы можете использовать write_file из File :: Slurp .Он абстрагируется от открытия / закрытия / штампа / печати. ​​

2 голосов
/ 25 февраля 2011
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: $!";
};

Если вам не требуется подключаться к базе данных для каждого выполняемого оператора, оставляйте базу данных открытой между операциями.

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