2009-04-11 8 views
5

Quiero mostrar los elementos de una matriz en un formato específico en Perl.¿Cómo puedo generar cada elemento de la matriz Perl entre comillas?

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

Algo debe ser la cadena '"A" "B" "C"' (cada elemento entre comillas dobles).

Sin embargo, si @myArray está vacío, entonces $text también debería estarlo. pensé en usar join(), como

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

que creo que sería trabajar. Sin embargo, ¿hay una manera más elegante de hacer esto?

Respuesta

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

Además, para hacer el código más limpio, se puede utilizar el operador qq// (se comporta exactamente igual que "", pero, puede elegir el delimitador) para evitar tener escapar de las " s.

+2

Soy un gran fan de mapa. Es increíblemente útil y creo que cada programador debe aprender a usarlo. –

+4

map y reduce (de List :: Util) son funciones vitales de orden superior. Si te gusta el mapa, te encantará Higher Order Perl por Mark Jason Dominus: http://hop.perl.plover.com/ –

+0

¿Hay alguna manera de hacer esto para comillas simples? – Johnathan1

-2

Puede que no haga exactamente lo que está preguntando, pero soy un gran fanático de Data :: Dumper para este tipo de cosas.

4

Chas. tiene la respuesta correcta, pero a veces utilizo la variable $", que posee la cadena de poner entre elementos de la matriz para la interpolación:

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

no estoy seguro sobre el uso de un "join". ¿Desea una única cadena escalar con elementos entre comillas o simplemente desea una matriz con elementos entre comillas? Si este último entonces sospecho la siguiente lo haría

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

Por supuesto, esto deja de lado la prueba si los elementos fueron originalmente expresados. Si desea que los elementos de la matriz citados para la inserción en una base de datos con DBI por ejemplo, entonces la manera más apropiada podría ser:

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

espero que esto ayude a

+0

¿Por qué se concatenan en lugar de interpolar? Un buen consejo sobre el segundo bit, sin embargo, había asumido que esto era para la salida que no pasa a otra cosa que interpretaría los valores como cadenas. –

+0

DOH! Por supuesto. :) Cambie la segunda línea de mi primer fragmento a: @a = map {qq | "$ _" |} @a; –

Cuestiones relacionadas