Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    73

    lettura numero decimale (o stringa)

    ciao a tutti, sono alle prime armi con il Perl

    ho un file che viene letto dal Perl

    es: preso da NS-2

    + 13.17184 2 1 tcp 250 ------- 4 11.4 0.2 1 355
    - 13.17184 2 1 tcp 250 ------- 4 11.4 0.2 1 355
    r 13.18384 2 1 tcp 250 ------- 4 11.4 0.2 1 355

    ho fatto un programmino che mi legge il file e quindi riga per riga mi legge i valori, dato che sono tutti in colonnati ho 12 colonne:

    # type: perl connectivityPacket.pl <trace file> <fromnode> <tonode> > output file

    # the first argument must be the trace file.
    $infile = $ARGV[0];
    $fromdofin=$ARGV[1];
    $tonode=$ARGV[2];

    Open the file.
    open (DATA,"<$infile")
    || die "Can't open $infile $!";
    $continue = 0;

    while (<DATA>) {
    @x = split(' ');


    e fino a qua va bene

    il fatto è che io voglio calcolare il percorso da 11.4 a 0.2 ok?

    ma volgio inserire solo la prima parte, ossia 11 e 0, come posso far leggere questo valore

    mi spiego meglio: allora 11.4 è il nodo 11 con porta 4 e 0.2 è nodo 0 e porta 2

    io non conosco le porte ma solo i nodi

    e quindi mi servirebbe un modo per cui passando come parametri 11 e 0 mi restituisca 11.4 e 0.2

    io ho fatto così:

    $x[8] eq $fromnode) && ($x[9] eq $tonode), ma purtroppo vede solo 11 e 0 e non 11.4 e 0.2,
    dato che gli passo come parametri 11 e 0

    come fare??

    poi, considerandoli sempre come stringa, avevo fatto pure $x[8] eq '$fromnode.4' per provare, ma niente

    devo trovare un modo per cui scrivendo come parametri 11 e 0, lui andando a leggere il file alla 8 e 9 colonna, mi legge 11.4 e 0.2

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2002
    Messaggi
    268
    non ho capito molto quello che vuoi, comunque, ti basta così?

    se sai che i valori sono sempre 11 e 4
    $porta1 = $x[8];
    $porta1 =~ s/11\.//;

    $porta2 = $x[9];
    $porta2 =~ s/0\.//;

    se vuoi evitare di sapere il primo nr:
    @mom = split(/\./,$x[8]);
    $porta1 = $mom[1];

    @mom = split(/\./,$x[9]);
    $porta2 = $mom[1];

    ... e ci sono molti altri modi x farlo ...

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    73
    grazie

    il fatto è che non conosco il 4 e 1, ossia le porte

    potrebbero essere anche altre

    casomai si puo fare una procedura che verifica quali node.port esistono, avendo il solo node

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    73
    consideriamo la colonna 8 ossia dove c'è 11.4

    allora
    da shell do i parametri tra cui 11

    è possibile avere una procedura che mi consenta di avere l'elenco delle stinghe 11.1 11.2 .....

    perchè dato come parametro 11 ricavare tutte le stringhe dell'8 colonnna dove compare 11, e quindi mi deve ridare 11.1 11.2 11.3 11.4 11.5 ......

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2002
    Messaggi
    268
    Originariamente inviato da basileus
    grazie

    il fatto è che non conosco il 4 e 1, ossia le porte

    potrebbero essere anche altre

    casomai si puo fare una procedura che verifica quali node.port esistono, avendo il solo node
    scusa, forse non hai provato quello che ti ho postato!
    Cmq se poi vuoi avere un array delle stringhe basta che metti un "push" ogni volta che fai una lettura.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    73
    forse mi sono spiegato male

    allora quello nel primo post è un pezzo di file di traccia in cui ho 11 colonne

    l'8 e 9 colonna sono la sorgente e destinazione di una connessione

    la sorgente e destinazione sono sempre determinate da nodo.porta

    volevo fare un programmino in cui inserendo sorgente e destinazione, ma solo il nodo e non la porta perchè io non la conosco diciamo, mi stampasse in un file tutte le sorgenti e destinazioni in formato nodo.porta

    e quindi inserendo solo 11 e 0 che sono la sorgente e destinazione, mi stampa:

    11.1 0.1
    11.2 0.2

    etc...

    non so se mi sono spiegato bene, passandogli come parametri 11 e 0 mi stampa anche le porte oltre al nodo in formato "11.1" come si vede nella colonna 8

    io vorrei che leggendo il file, passandogli i parmatri 11 e 0, mi stampa tutte le righe in cui compaiono all'8 e 9 colonna 11 e 0 ma come nodi non come porte, e quindi passandogli come paramtri 11 e 0 mi stampa il pezzo di file di traccia come si vede nel primo post

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    73
    secondo me non è tanto difficile

    io vorrei che leggesse il file facesse un if sulla 8 e 9 colonna simile a questo

    if ($x[8] eq '11' && $x[9] eq '0') {

    print STDOUT "$x[0]\t $x[1]\t $x[2]\t $x[3]\t........."
    }

    solo che mettndo per esempio 11 e 0 mi da errore perchè l'8 colonna prende solo 11.1 11.2 etc...
    ossia nodo.porta

    quindi io volevo che passando come parametro 11 e 0 il programma leggesse sull'8 e 9 colonna questi valori e scegliesse (stampasse) tutte le righe dove compare prima del . (punto) 11 e 0

    e quindi in parle povere:

    perl test.pl esempio.tr 11 0 > test.out questo è il comando da input che gli do

    questo diciamo il file di traccia

    r 10.695011 10 9 rtProtoDV 12 ------- 0 10.2 9.2 -1 323
    r 10.695011 10 11 rtProtoDV 12 ------- 0 10.2 11.6 -1 324
    + 11 0 1 tcp 40 ------- 1 11.1 0.1 0 325
    - 11 0 1 tcp 40 ------- 1 11.1 0.1 0 325

    io voglio che il programmino mi stampi solo

    + 11 0 1 tcp 40 ------- 1 11.1 0.1 0 325
    - 11 0 1 tcp 40 ------- 1 11.1 0.1 0 325

    dove seleziona le righe in cui compaiono sull'8 e 9 colonna 11 per la sorgente e 0 per la destinazione,

    e quindi il problema sta nel fatto che passando 11 e 0 come parametri mi da errore, ossia non stampa nulla, perchè l'8 colonna e la 9 sono in formato 11.porta 0.porta

    invece a me servirebbe che passandogli SOLO 11 e 0 mi stampasse tutte le righe in cui compra prima del . 11 e 0 nell'8 e 9 colonna rispettivamente


    grazie

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    73
    lo dico in maniera casareccia

    leggi il file
    considerando l'8 colonna per esempio
    consideriamo la prima riga: l'elemento dell'8 colonna è 0.0
    questo elemento ha 11 prima del . ? NO
    vai avanti, ad uncerto punto arrivaimo alla'iesima riga il cui nell'8 colonna c'è per esempio 11.1
    mi chiedo
    questo elemento ha 11 prima del . ? SI
    stampa sul file la riga
    vai avanti

    etc......

    a me serve solo sta cosa del verificare se 11 è prima del punto

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2002
    Messaggi
    268
    Originariamente inviato da basileus
    secondo me non è tanto difficile

    if ($x[8] eq '11' && $x[9] eq '0') {

    print STDOUT "$x[0]\t $x[1]\t $x[2]\t $x[3]\t........."
    }
    if ($x[8] =~ /11\./ && $x[9] =~ /0\./) {

    print STDOUT "$x[0]\t $x[1]\t $x[2]\t $x[3]\t........."
    }

    ovvero se $x[8] contiene "11." e $x[9] contiene "0." stampa la riga

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    73
    grazie funziona!!!

    ho visto su wiki che ci sono altri modo come per esempio

    $x[8]=~ m/[1][1][.]/

    e altri ancora

    casomai li provo

    ancora grazie

    non è male questo perl, soprattutto per quanto riguarda i file come ti ho fatto vedere io al primo post, ossia il file di traccia di NS-2

    EDIT: anzi anche se non ho provato non va bene penso $x[8]=~ m/[1][1][.]/

    $node=11 e quindi non saprei come metterlali al posto di [1][1][.]

    cmq grazie

    va bene così

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.