Newsgroup: it.comp.lang.perl
Titolo: concatenazione di stringhe

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Ciao a tutti,
è da poco che sto usando perl e non riesco a risolvere questo problema
1) apro un file di testo
2) leggo il contenuto e lo memorizzo riga per riga dentro un vettore
3) dopodichè voglio ottenere una stringa che riunisca tutto il file
concatenando le righe memorizzate negli elementi degli array
questo è il codice
###########################################################
open(INPUT,"< $infile") || die "Can't input $infile $!";
@vet;
while(<INPUT>){
~    chop $_;
~    push(@vet,$_);
}
$primo = $vet[0];
$secondo = $vet[1];
$tutto = $primo.$secondo."\n";
print($tutto);
###########################################################
In realtà quello che ottengo quando stampo è che la stringa $tutto non è
la concatenazione degli elementi ma sovrappone gli elementi
così se il mio file contiene le seguenti righe
la prima riga
seconda riga
quello che ottengo quando stampo è
secondaarigaa
Dove sta l'errore?
grazie
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)
Comment: Using GnuPG with Netscape - 
http://enigmail.mozdev.org
iD8DBQE+6H2IEmWhJyk37VsRAvxcAJ922Uu0ngCv1Yl3BAGKCERPHBNeKgCfVQKh
58DsOPj6o+B7JhZSYAgJALE=
=BKm9
-----END PGP SIGNATURE-----


Lavori sotto windows vero ?
usa chomp $_
al posto di chop $_;
e riprova.
 Raffaello

Dove sta l'errore?
Non mi sembra ci sia nessun errore. Di fatto non mi è riuscito di
riprodurre il comportamento.
Se vuoi mettere tutto il contenuto di un file in un array, comunque, il
modo più semplice per farlo è questo:
   @vet = <INPUT>;
E se vuoi eliminare il fine-riga, il modo più sicuro di farlo è:
   chomp($_);
Per unire tutti gli elementi di un array puoi usare anche join:
  $tutto = join('', @vet);
Ciao.

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
in realtà lavoro sotto linux rh7.3
ma il problema persiste anche usando chomp :-(
Raffaello Galli wrote:
|>-----BEGIN PGP SIGNED MESSAGE-----
|>Hash: SHA1
|>
|>Ciao a tutti,
|>? da poco che sto usando perl e non riesco a risolvere questo problema
|>
|>1) apro un file di testo
|>2) leggo il contenuto e lo memorizzo riga per riga dentro un vettore
|>3) dopodich? voglio ottenere una stringa che riunisca tutto il file
|>concatenando le righe memorizzate negli elementi degli array
|>
|>questo ? il codice
|>###########################################################
|>open(INPUT,"< $infile") || die "Can't input $infile $!";
|>
|>@vet;
|>
|>while(<INPUT>){
|>~    chop $_;
|>~    push(@vet,$_);
|>}
|>
|>$primo = $vet[0];
|>$secondo = $vet[1];
|>
|>$tutto = $primo.$secondo."\n";
|>
|>print($tutto);
|>###########################################################
|>
|>In realt? quello che ottengo quando stampo ? che la stringa $tutto non ?
|>la concatenazione degli elementi ma sovrappone gli elementi
|>
|>cos? se il mio file contiene le seguenti righe
|>
|>la prima riga
|>seconda riga
|>
|>quello che ottengo quando stampo ?
|>
|>secondaarigaa
|>
|>
|>Dove sta l'errore?
|>
|>grazie
|>
|>
|>
|>-----BEGIN PGP SIGNATURE-----
|>Version: GnuPG v1.2.1 (GNU/Linux)
|>Comment: Using GnuPG with Netscape - 
http://enigmail.mozdev.org
|>
|>iD8DBQE+6H2IEmWhJyk37VsRAvxcAJ922Uu0ngCv1Yl3BAGKCERPHBNeKgCfVQKh
|>58DsOPj6o+B7JhZSYAgJALE=
|>=BKm9
|>-----END PGP SIGNATURE-----
|
|
| Lavori sotto windows vero ?
| usa chomp $_
| al posto di chop $_;
| e riprova.
|
|  Raffaello
|
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)
Comment: Using GnuPG with Netscape - 
http://enigmail.mozdev.org
iD8DBQE+6IYXEmWhJyk37VsRAtE0AJwKoDm23OLlE9D/Ko6yHx8ksVeyLQCg0E4X
vqGV9xni2d5/0Dn5ZG37afk=
=il75
-----END PGP SIGNATURE-----

 ma il problema persiste anche usando chomp :-(
E' molto strano, sembra che ti stampi un "\r" alla fine di ogni riga.
Prova (per curiosita') a mettere subito $_ in una variabile
e poi a eliminare "\n":
while($line=<FILE>) {
	chomp $line;
	$line =~ s/\r$//g;
	etc ...
Raffaello

ma il problema persiste anche usando chomp :-(
Eppure l'unica spiegazione ragionevole č che tu abbia un file con i due
terminatori di riga CRLF, e ne cancelli solo uno. In questo modo, in $tutto
va effettivamente la concatenazione delle due stringhe, ma quando lo stampi
a schermo il CR al termine della prima stringa fa ricominciare la stampa
dalla prima colonna, stessa riga.
Altre possibili origini del comportamento, nel brano pubblicato, io non ne
vedo.
Ciao.

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
scoperto l'arcano!
Il problema era che il file di testo era stato generato sotto winXP...ho
ricreato il file sotto linux e tutto funziona...
Grazie per i suggerimenti....
Giorgio Mulas wrote:
| in realt? lavoro sotto linux rh7.3


iD8DBQE+6IvoEmWhJyk37VsRAihIAKDpYYPxa6aqnox2dC0Df1W8szy/uACgsD7h
xrDec5YVdl1nPcYoSle0/7U=
=UyvW
-----END PGP SIGNATURE-----

ricreato il file sotto linux e tutto funziona...
Da perl 5.8, se sai a priori che il file usa le convenzioni DOS per i
terminatori di riga, puoi fare:
    binmode INPUT, ':crlf';
oppure
 
    use open IN => ':crlf';
Ciao.

# removes \r\n at the end of the string
sub win_chomp {
	my $string = pop;
	$a=chr 13;
	$b=chr 10;
	$string =~ s/[$a|$b]$//g;
	return $string;
	}
 Raffaello

 # removes \r\n at the end of the string
[CUT]
Ancora + breve:
sub womp {
  $_[0] =~ s/[\x0D\x0A]+$//;
}
-- 
+--------+ ASCII ribbon campaign ( )
|  kral  |  - against HTML email  X 
+--------+              & vCards / \

    chomp($_);
reductio ad unum:
chomp(@vet = <INPUT>);
questo mette tutto il contenuto del file, eliminando i fine-riga, in
un array.
cheers,
Aldo
__END__
$_=q,just perl,,s, , another ,,s,$, hacker,,print;