2009-04-11 4 views
5

Je veux sortir les éléments d'un tableau dans un format spécifique en Perl.Comment générer chaque élément de tableau Perl entouré de guillemets?

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

Quelque chose doit être la chaîne « "A" "B" "C" » (chaque élément entre guillemets). Cependant, si @myArray est vide, alors $text devrait être aussi. Je pensais d'utiliser join(), comme

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

Ce que je pense fonctionnerait. Cependant, y a-t-il une manière plus élégante de faire ceci?

Répondre

26

Utilisation 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"; 

En outre, pour rendre le code plus propre, vous pouvez utiliser l'opérateur qq// (se comporte exactement comme "", mais vous pouvez choisir votre delimiter) pour éviter d'avoir échapper aux " s.

+2

Je suis un grand fan de carte. C'est incroyablement utile et je pense que chaque programmeur devrait apprendre à l'utiliser. –

+4

carte et réduire (à partir de List :: Util) sont des fonctions essentielles d'ordre supérieur. Si vous aimez la carte, vous allez adorer Higher Order Perl de Mark Jason Dominus: http://hop.perl.plover.com/ –

+0

Y at-il un moyen de faire cela pour les guillemets simples? – Johnathan1

-2

Il se peut que ce ne soit pas exactement ce que vous demandez, mais je suis un grand fan de Data :: Dumper pour ce genre de choses.

4

Chas. a la bonne réponse, mais parfois j'utilise la variable $", qui contient la chaîne à mettre entre les éléments du tableau pour l'interpolation:

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

Je ne suis pas sûr d'utiliser un « rejoindre ». Voulez-vous une seule chaîne scalaire avec des éléments entre guillemets ou voulez-vous simplement un tableau avec des éléments entre guillemets? Dans ce dernier cas alors je soupçonne que ce qui suit ferait

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

Bien sûr, cela évite le test si les éléments ont été cités à l'origine. Si vous voulez que les éléments du tableau cités pour l'insertion dans une base de données en utilisant DBI par exemple, la façon plus appropriée pourrait être:

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

J'espère que cette aide

+0

Pourquoi concaténéz-vous au lieu d'interpoler? Bon conseil sur le deuxième bit, j'avais supposé que c'était pour la sortie ne passant pas à autre chose qui interpréterait les valeurs comme des chaînes. –

+0

DOH! Bien sûr. :) Changez la deuxième ligne de mon premier fragment en: @a = map {qq | "$ _" |} @a; –

Questions connexes