2010-10-28 2 views
4

J'essayais de joindre des éléments d'un tableau Perl.En Perl, comment puis-je joindre des éléments d'un tableau après avoir entouré chaque élément entre parenthèses?

@array=('a','b','c','d','e'); 
$string=join(']',@array); 

me donnera

$string="a]b]c]d]e"; 

Y at-il de toute façon je peux obtenir rapidement

$string="[a][b][c][d][e]"; 

?

+2

Quoi, aucune réponse CPAN? Allez les gens ... on peut faire mieux que ça! :) – DVK

+0

@DVK: Vous pourriez penser à la réponse de Sinan comme le code source à un tel module;) – Zaid

Répondre

20

Une autre façon de le faire, en utilisant sprintf.

my $str = sprintf '[%s]' x @array, @array; 
+0

intéressant, veuillez expliquer pourquoi il y a @array, @array –

+7

Le premier tableau - en raison d'être un deuxième opérande de '" x "' opérateur - est évalué dans un contexte scalaire et est donC# d'éléments dans le tableau. La première expression devient: "[% s]" répété N fois (la signification de la chaîne "x" opérateur ".La seconde @array est juste une liste de paramètres passés à sprintf – DVK

+1

Truc génial..Trouvé utile plusieurs fois! – Jean

2

Peut-être:

{ 
    local $" = "]["; 
    my @array = qw/a b c d e/; 
    print "[@array]"; 
} 

Bien que vous devriez probablement:

print "[" . join("][", @array) . "]"; 

:-) Bonne codage

+0

Correction mineure: La syntaxe correcte serait: 'print" [". join ("] [", @array). "]"; ' – steinar

+0

@steinar Merci pour la correction - commutation entre les langues foiré avec mon cerveau. –

3
#!/usr/bin/perl 
use strict; use warnings; 

local $" = ''; 
my $x = qq|@{[ map "[$_]", qw(a b c d e) ]}|; 

Vous pouvez également généraliser un peu:

#!/usr/bin/perl 
use strict; use warnings; 

my @array = 'a' .. 'e'; 

print decorate_join(make_decorator('[', ']'), \@array), "\n"; 

sub decorate_join { 
    my ($decorator, $array) = @_; 
    return join '' => map $decorator->($_), @$array; 
} 

sub make_decorator { 
    my ($left, $right) = @_; 
    return sub { sprintf "%s%s%s", $left, $_[0], $right }; 
} 
+2

@Sinan Ünür: Il est clair que vous faites quelque chose de bien, compte tenu de votre réputation sur ce site. Cependant, pensez-vous vraiment que c'est une bonne solution pour donner à quelqu'un qui est clairement un nouveau programmeur Perl? Votre solution utilise une variable prédéfinie locale (qui n'est même pas étendue!), Qq avec des délimiteurs non standard, des listes incorporées, des tableaux anonymes et une carte. –

+0

Eh bien, maintenant vous avez l'auto-incrément de chaîne, les références de tableau, les sous-marins anonymes (et donc les fermetures), => au lieu d'une virgule, et sprintf. Je suppose que vous faites cela pour votre propre plaisir à ce stade! (PS: Il n'y a pas de mal à ça, ça n'aide pas l'OP.) –

+2

@ A.Rex: Détendez-vous. S'amuser un peu. La question a déjà reçu une réponse adéquate. –

13

Voici deux options:

#!/usr/bin/perl 

use strict; 
use warnings; 

my @array = 'a' .. 'e'; 
my $string = join('', map { "[$_]" } @array); 
my $string1 = '[' . join('][', @array) . ']'; 
+0

+1. Je suis respectueusement en désaccord avec Sinan Ünür. Ceci a la solution la mieux écrite postée jusqu'ici, à savoir la jointure sur "" d'un tableau mappé. Ceci est clairement distinct de la solution précédente utilisant qq | @ {[..]}}. –

+1

J'aime la solution join/map. – tchrist

+0

+1 en raison de la carte! – Sosi

Questions connexes