Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    7

    [Perl] Hash di array: confrontare alcuni elementi degli array

    Ciao a tutti,
    ho idea di non aver centrato il titolo con ciò che chiedo e me ne scuso anticipatamente.

    Ho un file di input costituito da testo con caratteristiche regolari, ogni riga inizia con un numero e poi ho dei codici separati ciascuno da una tabulazione.
    (es:
    1 xxx yyy zzz aaa bbb ccc ddd fff ggg
    )
    Ho inserito ogni riga di testo in un hash che prende come chiave il numero iniziale della riga e come valore un array contenente tutta la riga (così che l'elemento 6 dell'array sarà ccc)

    Io voglio salvare il valore dell'elemento 6 di tutte quelle righe/array che hanno come elemento 7 un certo valore e come elemento 3 un'altro. (so che l'elemento 6 è sempre un numero)
    Fatto questo, voglio rintracciare il valore, e quindi l'array, che ha come chiave il valore dell'elemento salvato precedentemente per poi eseguire altri controlli.

    Posto il codice:
    codice:
    %hash = ($r[0] => $r);
    	  foreach ($hash{$r[0]}[7]=~/regexp/){
    	      if ($hash{$r[0]}[3]=~/regexp/){
    		  $m=$hash{$r[0]}[2];
    		  $t=$hash{$r[0]}[6];     #fino qui tutto ok, riesco a stampare $m e $t
    
    		  if($hash{$r[$t]}[7]=~/regexp/){    #qui non prende il valore di $t
    		      if ($hash{$r[$t]}[3]=~/regexp/){
    		  	  $s=$hash{$r[$t]}[2];
    			  print "$s\t$m\n";
    		      }
    		  }		      
    	      }
    Perciò il mio problema è: come faccio a prendere il valore dell'hash che ha come chiave ciò che ho memorizzato in $t?
    Spero di essere riuscita a spiegarmi.
    Grazie a tutti per qualsiasi aiuto potrete darmi.

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Ma il valore di $t dove lo fai stampare e` un numero o una stringa?

    Se e` una stringa, ti conviene fare un cast esplicito, altrimenti potrebbe non essere valido usarlo come indice.
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    7
    Originariamente inviato da Mich_
    Ma il valore di $t dove lo fai stampare e` un numero o una stringa?
    No, in realtà volevo dire che nel punto dove ho inserito il commento che riuscivo a stampare le due variabili, intendevo che se inserivo un

    print "$m\t$t\n";

    $t viene stampato sul file di output ed è correttamente un numero

    Se e` una stringa, ti conviene fare un cast esplicito, altrimenti potrebbe non essere valido usarlo come indice.
    Ad ogni modo cosa intendi per cast esplicito?

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    In Perl c'e` confusione tra i tipi di variabili. Ma la differenza tra una stringa ed un numero c'e`.

    Il tuo $t puo` contenere il valore numerico (essere quindi un intero), oppure una stringa (contenere il/i carattere/i che rappresentano il numero intero).
    Una stringa (anche se contiene un valore numerico) non puo` essere l'indice di una matrice.

    Per cast in programmazione si intende trasformare esplicitamente la variabile in numerica.
    In Perl si puo` fare applicando la funzione (nel caso specifico):
    $t = int($t);
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    7
    Ciao, ho provato a usare la funzione int per fare il cast ma non era quello il problema, alla fine ho rinunciato con quel motodo e ho "risolto" la cosa così.

    Anche se mi procura un nuovo problema, ossia mi stampa le giuste combinazioni ma un numero apparentemente casuale di volte e non so come fare per dirgli che me le stampi solo una volta (ossia esattamente quante volte le trova nel file di input)..

    Posto il codice nel caso possa essere di "aiuto" a qualcuno.
    codice:
    	  %hash= ($r[0] => $r);  
    	      
    	foreach ($hash{$r[0]}[7]=~/regexp/){   
    	    if ($hash{$r[0]}[3]=~/regexp/){          
    		$m=\$hash{$r[0]}[1];	  
    		$t=$hash{$r[0]}[6];            
    		$t=int $t;
    				
    	    }
    	
    	} 
    	foreach($hash{$r[0]}[7]=~/regexp/){   
    	    if ($hash{$r[0]}[3]=~/regexp/){           
    		   $i=$hash{$r[0]}[0]; 
    		    $s=\$hash{$r[0]}[1];         
    			    
    	    }
    	    
    	    
    	}
    	  if ($i==$t){
    	     print "$$s\t$$m\n";
    	  }
    Nel frattempo, se qualcuno sa dirmi come mai mi stampa così tante volte e soprattutto come evitare il problema..ben venga.
    Grazie comunque per l'aiuto che ho ricevuto, non si finisce mai di imparare!

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 © 2025 vBulletin Solutions, Inc. All rights reserved.