Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Inserimento e sovrascrittura di stringhe

    Due piccole informazioni su Perl... qualcuno saprebbe dirmi come ottenere:

    1. L'inserimento di una stringa dentro un'altra, alla data posizione, SHIFTANDO quello che vien dopo verso destra. Esempio:

    $affermazione = "Mi Giovanni";
    $verbo = "chiamo ";
    -- inserisci la stringa $verbo dentro $afferma in posizione 3 (ovviamente senza conoscere il contenuto di $affermazione)

    in modo da ottenere come output "Mi chiamo Giovanni";

    2. L'inserimento di una stringa dentro un'altra, alla data posizione, SOVRASCRIVENDO quello che viene dopo. Esempio:

    $affermazione = "Mi xxxxxx Giovanni";
    $verbo = "chiamo";
    -- inserisci la stringa $verbo dentro $afferma in posizione 3 (ovviamente senza conoscere il contenuto di $affermazione)

    in modo da ottenere come output "Mi chiamo Giovanni";

    Naturalmente se esiste una soluzione senza dover ricorrere ad un collage di substr.

  2. #2
    espressioni regolari.

    ad esempio:

    $affermazione = "Mi Giovanni";
    $verbo = "chiamo ";

    $affermazione =~ s/^([^ ]+)\s(\w+)/$1 $verbo $2/;
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  3. #3
    grazie shishii, ma le espressioni regolari non si basano sul match? non ci capisco molto di espressioni regolari (dovrò ovviamente studiarmele per gustare fino in fondo Perl), ma credo che per usarle sia necessario conoscere il contenuto della stringa da modificare. nel mio caso non conosco il contenuto, ma conosco la posizione. ho comunque trovato una soluzione:

    $affermazione = "Mi Giovanni";
    $verbo = "chiamo ";
    substr($affermazione, 3, 0) = $verbo;

    per quanto riguarda l'inserimento, e

    $affermazione = "Mi xxxxxx Giovanni";
    $verbo = "chiamo";
    substr($affermazione, 3, 6) = $verbo;

    per quanto riguarda la sovrascrittura.

  4. #4
    tu avevi scritto di non voler usare substr

    perche in perl si scrive

    $affermazione="mi chiamo Giovanni";

    $r=index $affermazione," ";
    $pronome=substr $affermazione,0,$r;

    $affermazione=substr $affermazione,$r+1;

    $r=index $affermazione," ";

    $verbo=substr $affermazione,0,$r;

    $nome=substr $affermazione,$r+1;

    ### finale ######

    $affermazione=$pronome." ".$verbo." ".$nome;

    # da provare
    1+1=10

  5. #5
    Originariamente inviato da sgap
    tu avevi scritto di non voler usare substr
    quasi, non precisamente: volevo evitare un collage di substring, ovvero evitare qualcosa come

    $affermazione = substr($affermazione, 0, 3) . $verbo . substr($affermazione, 4, length($affermazione));

    che sarebbe stata la soluzione più evidente ma assolutamente non ottimale. la tua soluzione non è applicabile al mio caso in quanto avevo specificato anche di non conoscere il contenuto di $affermazione - mi risulterebbe quindi impossibile recuperare l'indice del blank come fai tu, in quanto non qual'é il carattere che deve precedere l'inserimento. conosco soltanto la posizione, a prescindere da quale sia il contenuto.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    OK, ci provo anch'io. Con le RE
    codice:
    my $affermazione = "Mi xxxxxx Giovanni";
    my $verbo = "chiamo";
    my $re = "^(.{3})(.{".length($verbo)."})(.+)$";
    $affermazione =~ s/$re/$1$verbo$3/;
    Spero di non aver fatto errori di sintassi (e` un po' che non uso piu` Perl).
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  7. #7
    una premessa: apprezzo davvero tantissimo vedendo la partecipazione per aiutarmi a capire la soluzione migliore, difficilmente ho trovato in altri forum questo interesse.

    finite le sviolinate, mich, propongo uno spunto di riflessione: non conosco bene Perl (come ho detto, sono un newbe), ma ho la sensazione che la soluzione

    $affermazione = "Mi Giovanni";
    $verbo = "chiamo ";
    substr($affermazione, 3, 0) = $verbo;

    sia più prestante rispetto all'utilizzo delle RE, per un motivo - dimmi se dico una cagata - : il meccanismo della substr è probabilmente scritto in C e compilato, e non necessita quindi di interpretazione. usando le RE invece - immagino - venga tirato in ballo un interprete di RE, che debba leggere, capire ed eseguire la RE stessa.

    Certo, nell'esempio che ho riportato la differenza è ridicola, ma quest'operazione dovrò eseguirla 13,2 miliardi di campi (non sto scherzando - sono 600 milioni di record con 22 campi di media a testa), e su queste dimensioni credo che la differenza si noti.

    Sei d'accordo con me?

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Be`, allora la cosa cambia.

    Abbandona il Perl e fai la cosa in C: e` sicuramente piu` veloce. Perl e` interpretato, C e` compilato.
    Tra l'altro ci sono gradi di ottimizzazione diversi in C (vedi il parametro -o del compilatore).

    Comunque le RE sono molto veloci, ma dipende da come sono ottimizzate nel compilatore Perl che stai usando tu, per cui non e` detto che il substr sia piu` veloce.

    Altro elemento discriminante: la velocita` di accesso al database. Se usi un programma che a sua volta legge il database e poi lo scrive (qualunque programma sia), ha necessita` di fare due query sul database per ogni record (o per ogni campo, a seconda di come imposti).
    Nel tuo caso sarebeb bello avere il database stesso che chiama la funzione (da includere in qualche modo); cosi` potresti fare un solo accesso al database, e poi il database stesso esegue il lavoro.
    Nota che non conosco queste problematiche (i DB li ho usati poco, e sempre usando accessi standard), per cui la mia e` solo un'idea teorica.
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  9. #9
    Per quanto riguarda il file sorgente mi viene spedito in formato txt via FTP, i dati non risiedono quindi su database. Per quanto riguarda la scrittura userò un'utility di caricamento fornita dal vendor (nel caso di DB2 la Load, nel caso di Oracle SQLLoader) i quali effettuano una copia binaria dei datapages di dati, bypassando quindi qualunque statement SQL (a differenza delle utility di import, che sfruttano le INSERT), e la cosa abbatte notevolmente i tempi di inserimento.

    Per quanto riguarda il C, sarebbe piaciuto anche a me, ma purtroppo qualunque cosa che leghi all'OS è bandita. Ho già dovuto combattere all'ultimo sangue per farmi concedere l'utilizzo delle utility di caricamento del DB (che ovviamente ti legano al database), e per farlo ho dovuto dimostrare che utilizzando le INSERT i tempi di caricamento erano 71000% (in lettere: settantunmila percento) superiori a quelli dei requisiti............

  10. #10
    La libreria Perl integrata per le RE è scritta in C ed è considerata una delle più veloci.

    E comunque fai una prova con un ciclo prima con la RE e poi con la substr.

    Per fare i test inserisci all'inizio dello script:

    use Benchmark;
    $t0 = new Benchmark;

    ed alla fine:

    $t1 = new Benchmark;
    $td = timediff($t1, $t0);
    print "Tempo di CPU di esecuzione: ",timestr($td),"\n";
    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.