2009-04-11 8 views
5

Voglio esportare gli elementi di una matrice in un formato specifico in Perl.Come faccio ad esportare ogni elemento di matrice Perl circondato tra virgolette?

@myArray = ("A", "B", "C"); 
$text = something; 

Qualcosa dovrebbe essere la stringa '"A" "B" "C"' (ogni elemento racchiuso tra virgolette).

Tuttavia, se @myArray è vuoto, dovrebbe essere anche $text. Ho pensato di utilizzare join(), come ad esempio

$text = "\"" . join("\" \"", @myArray) . "\""; 
if ($text eq "\"\"") 
{ 
    $text = ""; 
} 

Che credo funzionerebbe. Tuttavia, c'è un modo più elegante per fare questo?

risposta

26

Uso map:

#!/usr/bin/perl 

use strict; 
use warnings; 

my @a = qw/ A B C /; 
my @b; 
my $text = join ' ', map { qq/"$_"/ } @a; 
print "text for (@a) is [$text]\n"; 

$text = join ' ', map { qq/"$_"/ } @b; 
print "text for (@b) is [$text]\n"; 

Inoltre, per rendere il codice più pulito, è possibile utilizzare l'operatore di qq// (si comporta esattamente come "", ma è possibile scegliere la delimitatore) per evitare di dover sfuggire alle " s.

+2

Sono un grande fan di carta. È incredibilmente utile e penso che ogni programmatore dovrebbe imparare come usarlo. –

+4

map e reduce (da List :: Util) sono funzioni di ordine superiore di importanza vitale. Se ti piace la mappa, amerai Higher Order Perl di Mark Jason Dominus: http://hop.perl.plover.com/ –

+0

C'è un modo per fare questo per le virgolette singole? – Johnathan1

-2

Potrebbe non fare esattamente quello che stai chiedendo, ma sono un grande fan di Data :: Dumper per questo genere di cose.

4

Chas. ha la risposta giusta, ma a volte io uso la variabile $", che detiene la stringa da inserire tra gli elementi dell'array per interpolazione:

my $text = do { local $" = q<" ">; qq<"@array"> }; 
1

Non sono sicuro su come utilizzare una "join". Vuoi una singola stringa scalare con gli elementi quotati o vuoi semplicemente un array con gli elementi quotati? In quest'ultimo caso, allora ho il sospetto quanto segue lo farebbe

my @a = qw|a b c|; 
@a = map {qq|"$_"|} @a;  

Naturalmente questo elude il test se gli elementi sono stati citati in origine. Se si desidera che gli elementi dell'array citati per l'inserimento in un database utilizzando DBI per esempio, allora il modo più appropriato potrebbe essere:

@a = map{$dbh->quote($_)} @a; 

Spero che questo aiuta

+0

Perché concateni invece di interpolare? Un buon consiglio sul secondo bit, avevo pensato che fosse per l'output che non passava a qualcos'altro che avrebbe interpretato i valori come stringhe. –

+0

DOH! Ovviamente. :) Modificare la seconda riga del mio primo frammento in: @a = map {qq | "$ _" |} @a; –

Problemi correlati