2009-04-11 11 views
5

Dizinin öğelerini Perl'de belirli bir biçimde çıkarmak istiyorum.Her Perl dizi öğesini tırnak içine alınmış şekilde nasıl gönderirim?

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

şey dize '"A" "B" "C"' (çift tırnak içine her öğe) olmalıdır.

Ancak, @myArray boş ise, $text da olmalıdır. Böyle

ben işe yarayacağını düşünüyorum
$text = "\"" . join("\" \"", @myArray) . "\""; 
if ($text eq "\"\"") 
{ 
    $text = ""; 
} 

olarak, join() kullanarak düşündü. Ancak bunu yapmanın daha şık bir yolu var mı?

cevap

26

Kullanım map:

Ayrıca
#!/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"; 

, kod temiz hale getirme, siz (tam "" gibi davranır, ancak sınırlayıcı seçebilir) qq// operatörünü kullanabilirsiniz " s kaçmak zorunda kalmamak için.

+2

yardımcı olur. İnanılmaz derecede yararlı ve her programcının onu nasıl kullanacağını öğrenmesi gerektiğini düşünüyorum. –

+4

harita ve azaltma (List :: Util'den) hayati derecede yüksek sipariş fonksiyonlarıdır. Eğer haritayı seviyorsanız, Mark Jason Dominus'un Higher Order Perl'sini seveceksiniz: http://hop.perl.plover.com/ –

+0

Tek tırnaklar için bunu yapmanın bir yolu var mı? – Johnathan1

-2

Tam olarak ne soruyor olabilirsiniz, ancak bu tür bir şey için Data :: Dumper'ın büyük bir hayranıyım.

4

Chas.

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

bir "katıl" kullanma konusunda emin değilim: doğru cevabı vardır, ama bazen enterpolasyon için dizi elemanları arasında koymak dize tutan $" değişkeni kullanır. Tırnaklı elemanlara sahip tek bir skaler dizge mi yoksa sadece teklif edilen öğeleri içeren bir dizi mi istiyorsunuz? İkincisi o zaman şu da

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

bu elemanlar başlangıçta sözleri kaydedildi olmadığını testi sidesteps ders Of yapacağını şüpheleniyorsanız. Örneğin DBI kullanarak bir veritabanına eklemek için alıntı dizi elemanlarını isterseniz, o zaman daha uygun bir yol olabilir:

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

Biliyorum bu haritanın büyük bir hayranıyım

+0

Neden enterpolasyon yapmak yerine birleştirme yapıyorsunuz? Yine de ikinci tavsiyede iyi tavsiyelerde bulunmuştum, bunun çıktısını dizge olarak yorumlayacak başka bir şeye geçmediğini varsaymıştım. –

+0

DOH! Tabii ki. :) İlk fragmanımın ikinci satırını şu şekilde değiştir: @a = map {qq | "$ _" |} @a; –

İlgili konular