Newsgroup: it.comp.lang.perl
Titolo: CGI e param

allora, sto recuperando dei dati da un hidden field di 1 pagina precedente,
che sono contenuti in $q->param('dati') e apparentemente sono separati da
spazi (se faccio print $q->p(param('dati')) me li da cosi': dato1 dato2
dato3 ecc.
allora se io faccio:
@array_dati = split(/\s/, $q->param('dati'));
la variabile array contiene solo il primo dato del hash. Gli altri? X' split
non splitta?
TIA,
Valerio

Guarda su
http://www.perl.it/documenti/articoli/mb_corso_perl/mb_corso_perl_6.html
devi usare \s con il + o meglio con il * altrimenti si ferma al primo
match che trova. (esempio: @array_dati = split(/\s*/, $q->param('dati'));
) Alla pagina che ti ho indicato trovi gli operatori e le loro differenze.
Ciao,
   Alberto.


 devi usare \s con il + o meglio con il * altrimenti si ferma al primo
match
mannaggia!
con \s* prende il primo dato e lo separa in una lettera per hash........
c'e' qualcosa che mi sfugge...... se il dato al primo posto e' "datouno" lui
mi stampa:
d
a
t
o
u
n
o
---
il codice rilevante e' cosi:
@data_mail = split(/\s*/, $query->param('emailready'));
  print $query->h3('Messaggio inviato con successo');
  foreach $data_mail (@data_mail) {
  print $query->p($data_mail);
  }
ri-grazie!!!!


split /\s*/ ti esegue la divisione su "zero o piu' spazi".
siccome in "datouno" ci sono 0 spazi fra "d" e "a", prende
la "d" come primo elemento, e cosi' via.
Per separare su uno o piu' spazi, usa questo:
split(' ', $query->param('emailready')
Cito da perldoc -f split:
As a special case, specifying a PATTERN of space (’ ’) will split on white space just as
"split" with no arguments does.  Thus, "split(’ ’)" can be used to emulate awk’s default
behavior, whereas "split(/ /)" will give you as many null initial fields as there are leading
spaces.  A "split" on "/\s+/" is like a "split(’ ’)" except that any leading whitespace pro-
duces a null first field.  A "split" with no arguments really does a "split(’ ’, $_)" inter-
nally.
Quindi non usare nemmeno \s+, perche' ti troveresti degli elementi vuoti se la tua stringa
originale ha degli spazi in testa o in coda. Usa semplicemente ' ', non / /.
Vedi anche questo esempio:
http://www.perlmonks.org/index.pl?node_id=287545
Ciao
gmax
-- 
  _  _ _  _
(_|| | |(_|><
  _|
http://gmax.oltrelinux.com

 split(' ', $query->param('emailready')
sara' ma a me continua a restituire _solo_ il primo nome esattamente come
/\s/ e come /\s+/... dev'essere qualcosa nel codice che non va....
ufffffffffffffffffffff!!!!!


un po' di debugging.
prima di split, stampa il contenuto della stringa in input, e vediamo cosa c'e'.
Guarda questo esempio:
#!/usr/bin/perl
use strict;
use warnings;
my $input = 'xxx yyy zzz aaa bb cc';
print $input, "\n\n";
my @data_mail = split( ' ' , $input);
foreach my $item (@data_mail)
{
     print "<$item>\n";
}
che produce:
xxx yyy zzz aaa bb cc
<xxx>
<yyy>
<zzz>
<aaa>
<bb>
<cc>
ciao
gmax
P.S. Stai usando strict e warnings, vero?


 P.S. Stai usando strict e warnings, vero?
ehm, no... con strict e warn mi dice su alcune variabili (ne riporto una ma
lo fa anche con altre, magari e' questo il problema):
Global symbol "$name" requires explicit package name at ./
nomefile.pl
 line
55
il contenuto della variabile che voglio separare in array
($query->param('emailready')) se stampato e' del tipo "alfa beta gamma
delta"; io vorrei rraggiungere l'obiettivo di avere in ogni cella dell'array
una parola: "alfa", "beta, "gamma","delta"... sembrerebbe semplice ma....
non so + dove sbattere il capo!!!
grazie x aiuto

 non so + dove sbattere il capo!!! 
Credo di aver individuato la causa del tuo problema.
Deriva dal comportamento del metodo param di CGI il quale, quando 
restituisce valori multipli, se valutato in array context restituisce in 
effetti un array contenente i diversi valori ma, se valutato in scalar 
context, restituisce solamente il *primo* elemento dell'array (e *non* 
il numero di elementi dell'array, come avviene per gli array e come 
forse ci si potrebbe aspettare).
E' molto probabile che nel tuo caso param restituisca valori multipli 
(emailready è una select a selezioni multiple, vero?) e siccome nel tuo 
caso stai passando alla funzione split, come secondo argomento, 
direttamente la chiamata:
	$query->param('emailready')
stai forzando lo scalar context sul metodo param, dal momento che la 
split richiede uno scalare come secondo argomento.
In sostanza il tuo problema si risolve banalmente così:
	@data_mail = $query->param('emailready');
	print $query->h3('Messaggio inviato con successo');
	foreach $data_mail (@data_mail) {
		print $query->p($data_mail);
	}
senza nessuna necessità della split, visto che param già ti restituisce 
un array bell'e pronto (in casi come il tuo, sempre se ho visto giusto).
In ogni caso non tralasciare i validissimi consigli di gmax (use strict 
e warnings).
Ciao,
Emanuele.

 @data_mail = $query->param('emailready');
mi sembrava di averci provato, ma di non aver ottenuto nulla, xo' forse ho
fatto $data_mail = $query ecc...
ora provo con @data e ti dico!!!
bye!!! e grazie a tutti x le dritte!