2016-10-29 4 views
0

Auf dieses einfache Programm, wie kann ich ein Komma zwischen jeder Entität setzen, aber lassen Sie es und das Ende?Perl Drucken Ascii Test mit CHR()

$ cat array_maker.pl 
#!/usr/bin/perl 
use strict ; 
use warnings ; 

my @total = @ARGV ; 
my $d_quote = chr(34); 
my $comma = chr(44); 


foreach my $total(@total) { 
    print " $d_quote$total$d_quote$comma" ; 
} 

ich dieses:

$ ./array_maker.pl one two three four 
"one", "two", "three", "four", 

Ich möchte dies:

"one", "two", "three", "four" #no comma at end of string. 

Antwort

0

Die iterative Art und Weise ist:

for (my $i=0;$i<scalar(@total);$i++) 
{ 
    print $d_quote . $total[$i] . $d_quote; 
    if ($i != (scalar(@total) - 1)) { print $comma; } 
} 
+0

Sie scheinen ein Händchen dafür zu haben, Dinge zu komplizieren! 'für (my $ i = 0; $ i 0') als am Ende (' if $ i <$ # total'). – ikegami

+0

Ein Noob wird nichts davon verstehen, ohne noch mehr nachzuschlagen. –

+0

Wovon sprichst du ??? Schau nochmal! Es benutzt nicht nur mehr Dinge als deins, es ist viel nützlicher und einfacher. Ich glaube nicht, dass ich jemals C-Style 'for' oder' scalar (@a) 'benutzt habe; diese selten nützlichen und komplizierten Strukturen über diejenigen zu unterrichten, die täglich benutzt werden, ist keine gute Sache! Vor allem, wenn es zu so unlesbarem Code kommt! – ikegami

3

Sie können anstelle der Array-Index durchlaufen, und fügen Sie das Komma unless $i == $#array;.

Aber hier ist eine andere Art und Weise

print join $comma, map { "$d_quote$_$d_quote" } @total; 
0

Hier ist eine Art und Weise

print $d_quote . join("$d_quote$comma$d_quote", @total) . $d_quote; 
2

Es ist viel einfacher, das Komma zu Beginn des drucken Schleife (wenn nötig) als am Ende.

for my $i (0..$#total) { 
    print "," if $i > 0; 
    print qq{"$total[$i]"}; 
} 

print("\n"); 

Ich würde dieses die folgenden nicht empfehlen, aber es zeigt Sie nicht wirklich die Indizes müssen:

for (@total) { 
    print "," if \$_ != \$total[0]; 
    print qq{"$_"}; 
} 

print("\n"); 

Aber join funktioniert viel besser.

print(join(",", map { qq{"$_"} } @total), "\n"); 

Schließlich sieht es so aus, als ob Sie CSV generieren. Sie sollten wirklich Text::CSV_XS dafür verwenden!

use Text::CSV_XS qw(); 

my $csv = Text::CSV_XS->new({ binary => 1, auto_diag => 2 }); 

$csv->say(\*STDOUT, \@total); 

Bei Bedarf werden Zitate hinzugefügt, und bei Bedarf werden Fluchten verwendet.

+0

das ist sehr consicise - ich wünschte, ich könnte einfach Code wie folgt schreiben: für meine $ i (0 .. $ # total) { print "," wenn $ i> 0; Drucken qq {"$ total [$ i]"}; – capser