perl скрипт не работает, странности

Модератор: Модераторы разделов

Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

perl скрипт не работает, странности

Сообщение gcc »

ошибка он не работает полностью, обновляет в конце только один раз!!

Код: Выделить всё

#!/usr/bin/perl

use DBI;



$db_name = 's11_db';

    # user from db
   $db_user = 'root';
   $db_pass = '';
   $db_type = 'mysql';
   $db_host = 'localhost';

    $dbh = DBI->connect(
"DBI:$db_type:database=$db_name;host=$db_host",
        $db_user,
        $db_pass,
        { RaiseError => 1,
         PrintError => 1 }
    ) || die $DBI::errstr;




       my $sth = $dbh->prepare(
       'select ID_TOPIC, body  from messages  where ID_BOARD = 18 AND ID_TOPIC != 168 limit 250'
                             );
        $sth->execute();

        my $rows;
      push @{$rows}, $_ while $_ = $sth->fetchrow_hashref();
        $sth->finish();


        my $test;



        foreach $_ ( @{$rows} ) {


        $dbh->do(
            qq{DELETE FROM messages
                         WHERE ID_TOPIC = ?
                         AND ID_TOPIC != 168
                         },
            undef, $_->{ID_TOPIC}
                );








        # $_->{body} =~ s/...//;


      #  $_->{body} =~ s/&lt;/</;

      #  $_->{body} =~ s/&gt;/>/;

      #  $_->{body} =~ s/&quot;/""/;


        $_->{body} =~ s/Цитата//;


        $_->{body} =~ s/#3(.{1,6})//;


      #   $_->{body} =~ s/\[b\]            \[/b\]//;


        $_->{body} =~ s/#4(.{1,6})//;

        $_->{body} =~ /(?:[http\:\/\/])(?:[\w\-]+\.)(\w+(?:[\.\-]))(?=[\.org.ru\.fff])/goi;

        $_->{body} =~ s/http\:\/\/bash.org.ru\/quote\/(.{1,6})//;

        $test .= " $_->{body} \n ====================================================== ";



        next if ($_->{ID_TOPIC} == 168);


        $dbh->do(
            qq{INSERT INTO bad_topic (bad_topic,
                             true_topic)
              VALUES (?,168)
              },
                undef, $_->{ID_TOPIC}  );






        }




       my $sth = $dbh->prepare(
                   'UPDATE messages
                           SET
                           body = ?
                     WHERE ID_TOPIC = 168'
                             );
        $sth->execute($test);



        $sth->finish();
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: perl скрипт не работает, странности

Сообщение NickLion »

Не очень понятно, что один раз работает, а что нет. Цикл выполняется, но не работают DELETE/INSERT или как? Как вариант - попробуйте избавиться от $_ в цикле:

Код: Выделить всё

foreach my $row ( @{$rows} ) {

и заменяя далее по тексту.
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: perl скрипт не работает, странности

Сообщение gcc »

извините, не правильно вопрос сформулировал, но там я не понял в чем проблема!! не смог сформулировать

по-моему там потому что оно проходит через 2 цикла сразу, один цикл внутри другого...

я сделал по проще, чтобы время не тратить... там руками пришлось ковырнуть!!

ну вот аналогичные проблемы с двумя циклами

http://forum.vingrad.ru/forum/topic-256013.html
http://forum.vingrad.ru/forum/topic-239736.html

почему там не работают 2 цикла?
решилось тем чтобы написать одним циклом, но иногда надо чтобы было 2 для некоторых не легких обработок...
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: perl скрипт не работает, странности

Сообщение diesel »

Код: Выделить всё

#!/usr/bin/perl

use DBI;



$db_name = 's11_db';

    # user from db
$db_user = 'root';
$db_pass = '';
$db_type = 'mysql';
$db_host = 'localhost';

$dbh = DBI->connect(
    "DBI:$db_type:database=$db_name;host=$db_host",
        $db_user,
        $db_pass,
        { RaiseError => 1, PrintError => 1 }
) || die $DBI::errstr;


my $sth = $dbh->prepare('select ID_TOPIC, body  from messages  where ID_BOARD = 18 AND ID_TOPIC != 168 limit 250');
$sth->execute();

my $rows;
push @{$rows}, $_ while $_ = $sth->fetchrow_hashref();
$sth->finish();


 my $test;

 foreach $_ ( @{$rows} ) {
     $dbh->do( qq{DELETE FROM messages WHERE ID_TOPIC = ? AND ID_TOPIC != 168 },undef, $_->{ID_TOPIC} );
     $_->{body} =~ s/Цитата//;
    $_->{body} =~ s/#3(.{1,6})//;
    $_->{body} =~ s/#4(.{1,6})//;
     $_->{body} =~ /(?:[http\:\/\/])(?:[\w\-]+\.)(\w+(?:[\.\-]))(?=[\.org.ru\.fff])/goi;
     $_->{body} =~ s/http\:\/\/bash.org.ru\/quote\/(.{1,6})//;
     $test .= " $_->{body} \n ====================================================== ";
     next if ($_->{ID_TOPIC} == 168);
    $dbh->do(qq{INSERT INTO bad_topic (bad_topic,true_topic) VALUES (?,168) }, undef, $_->{ID_TOPIC}  );
 }




my $sth = $dbh->prepare('UPDATE messages SET body = ? WHERE ID_TOPIC = 168' );
$sth->execute($test);
$sth->finish();

переформатировал немного. не могу понять о каком втором цикле идет речь. что где видится внутри другого?
Спасибо сказали: