Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Can't call method "finish" on an undefined value

    Salve, è solo da poco tempo che sono nel mondo di perl ed ho questo problema "Can't call method "finish" on an undefined value" quando lancio lo scipt da shell di unix.
    Il pezzo di codice è:

    my $dbh = "";

    sub dbconnect {
    my $dbh = DBI->connect( "DBI:mysql:database=$database;host=$hostname",$dbu ser, $dbpasswd,
    { RaiseError => 1, PrintError => 1, AutoCommit => 0,LongReadLen => 128, LongTruncOk => 'true'});
    warn DBI::errstr if $DBI::err;

    return $dbh;
    }

    sub dbdisconnect {
    $dbh->disconnect;
    }

    $dbh=dbconnect ();

    $filename = $ARGV[0];
    $CodStaz = $ARGV[1];

    my $select_str;

    open(FILE, "< $filename") || die "Errore! Ti sei ricordato del file.txt? E il CodStaz?\n\n";
    while ($riga = <FILE>) {

    next if !($riga =~ /^\d\d\\s\d\\s\d\d\d\d/);

    my @linea = split (" ", $riga);
    my $data_ok = sprintf ("%04d-%02d-%02d %02d:%02d",$linea[2],$linea[1],$linea[0],$linea[3],$linea[4]);

    $select_str = "INSERT INTO dati (CodStaz,CodSens,CodMarcaSens,Valore,DataOra,CodTi po,Serie) VALUES (\"$CodStaz\",\"1\",\"0\",\"$linea[5]\",\"$data_ok\",\"22\",\"1\")";

    $sth = $dbh->prepare($select_str);
    warn DBI::errstr if $DBI::err;

    $sth->execute ();
    warn DBI::errstr if $DBI::err;

    #print "$linea[1] @str_ora\n";
    #print "INSERT INTO dati (CodStaz,CodSens,CodMarcaSens,Valore,DataOra,CodTi po,Serie) VALUES ($CodStaz,1,0,$linea[2],$data_ok,22,1\n";

    }
    $sth->finish;
    close (FILE);

    dbdisconnect();


    Se qualcuno è così gentile da dirmi se la regexp "next if !($riga =~ /^\d\d\\s\d\\s\d\d\d\d/);" è corretta.....
    sicuramente avrò fatto altri errori....
    Grazie per ora.

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Non ho controllato tutto il codice, ma non mi piace la tua RE.

    Anzitutto si potrebbe riscriverla come:
    /^\d{2}\\s\d\\s\d{4}/

    che corrisponde a:
    due_cifre backslash carattere_s cifra backslash carattere_s quattro_cifre

    E` quello che volevi?
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  3. #3
    Grazie per la reg, proverò il tuo consiglio; comunque il problema più grosso è il messagio:
    "Can't call method "finish" on an undefined value" quando lancio lo script dalla shell di unix.
    Non so come mai, sicuramente sono io che sbaglio qualcosa, visto che è da poco che mastico perl....
    Ciao e grazie per ora

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Cosi` ad occhio direi che una delle funzioni/metodi che chiami (consapevolmente o meno) a sua volta utlizza il metodo "finish" su un oggetto su cui non puo` applicarlo.

    Per circoscrivere il problema potresti togliere (commentare) le istruzioni una alla volta (o a gruppi), in modo da verificare dove si verifica.

    Anche una serie di print in posizion strategiche dello script possono aiutare. PS: se usi print devi scrivere su STDERR, oppure usare il fflush ogni volta, altrimenti cio` che ha scritto potresti non vederlo (rimane nel buffer e non sul file/terminale).
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  5. #5
    per maggior correttezza scrivi:
    $sth->finish();

    A parte questo tieni presente che tu crei il puntatore $sth all'interno di un ciclo che finisce ovviamente quando la condizione posta è falsa, al contrario cerchi di usare il metodo finish fuori dal ciclo. Probabilmente all'uscita del ciclo $sth non esiste più (per esserne certi dovresti usare il debugger).

    Dovresti inserire $sth->finish(); all'interno del ciclo prima dell'uscita in modo che si riferisca ad ogni puntatore $sth creato.

    Ad ogni modo per quello che devi fare tu è molto meglio:

    $dbh->do("LOCK TABLES dati WRITE");
    while ($riga = <FILE> ) {

    next if !($riga =~ /^\d\d\\s\d\\s\d\d\d\d/);

    my @linea = split (" ", $riga);
    my $data_ok = sprintf ("%04d-%02d-%02d %02d:%02d",$linea[2],$linea[1],$linea[0],$linea[3],$linea[4]);

    $select_str = "INSERT INTO dati (CodStaz,CodSens,CodMarcaSens,Valore,DataOra,CodTi po,Serie) VALUES (\"$CodStaz\",\"1\",\"0\",\"$linea[5]\",\"$data_ok\",\"22\",\"1\")";

    $dbh->do("$select_str");
    }
    $dbh->do("UNLOCK TABLES");


    ricordandoti di eliminare anche l'istruzione $sth->finish();
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  6. #6
    Grazie per i preziosi consigli, proverò a fare in questo modo. Ti faccio sapere.
    Ciao Cristiano

  7. #7
    Grazie per i consigli shishii, avevi ragione: mettendo il finish() dentro al ciclo finziona!

  8. #8
    rimane il fatto che per gli insert, salvo casi particolari è meglio il metodo "do" e non "prepare" - "execute".
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.