2009-04-11 2 views
5

Ich möchte die Elemente eines Arrays in einem bestimmten Format in Perl ausgeben.Wie gebe ich jedes Perl-Array-Element in Anführungszeichen um?

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

Etwas sollte die Zeichenfolge '"A" "B" "C"' sein (jedes Element in doppelten Anführungszeichen). Wenn @myArray leer ist, dann sollte $text auch sein. ich daran gedacht, mit join(), wie

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

Was ich denke, funktionieren würde. Gibt es jedoch einen eleganteren Weg dies zu tun?

Antwort

26

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

, auch den Code sauberer zu machen, können Sie den qq// Operator (verhält sich genau wie "", aber Sie können wählen Sie Ihre Trennzeichen) zu vermeiden, die Flucht der " s.

+2

hilft Ich bin ein großer Fan von Karte. Es ist unglaublich nützlich und ich denke jeder Programmierer sollte lernen wie man es benutzt. –

+4

Karte und reduzieren (von List :: Util) sind wichtige Funktionen höherer Ordnung. Wenn Sie Karte mögen, werden Sie Higher Order Perl von Mark Jason Dominus lieben: http://hop.perl.plover.com/ –

+0

Gibt es eine Möglichkeit, dies für einfache Anführungszeichen zu tun? – Johnathan1

-2

Es könnte nicht genau das tun, was Sie fragen, aber ich bin ein großer Fan von Data :: Dumper für diese Art von Sache.

4

Chas. hat die richtige Antwort, aber manchmal benutze ich die $" Variable, die die Zeichenfolge setzen zwischen Arrayelementen für die Interpolation gilt:

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

Ich bin nicht sicher über die Verwendung einer „Join“. Möchten Sie eine einzelne skalare Zeichenfolge mit in Zitierten Elementen oder möchten Sie nur ein Array mit in Zitierten Elementen? Wenn dieser dann vermute ich folgendes tun würde es

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

Natürlich ist diese ausweicht den Test, ob die Elemente ursprünglich zitiert wurden. Wenn Sie die Array-Elemente zitieren zum Einfügen in eine Datenbank mit DBI zum Beispiel wollen, dann könnte der geeignetere Weg:

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

Ich hoffe, die

+0

Warum verketten Sie statt zu interpolieren? Gute Ratschläge für das zweite Bit, ich hatte angenommen, dass dies für eine Ausgabe war, die nicht an etwas anderes weitergegeben wurde, das die Werte als Zeichenfolgen interpretieren würde. –

+0

DOH! Na sicher. :) Ändere die zweite Zeile meines ersten Fragments in: @a = map {qq | "$ _" |} @a; –