web-dev-qa-db-fra.com

Façons d'aplatir un tableau Perl dans un contexte scalaire

J'ai récemment commencé à apprendre Perl et j'ai une question à laquelle je ne trouve pas de réponse claire sur Internet. dis que j'ai quelque chose comme ça,

@arr = (1, 2, 3);
$scal = "@arr"
# $scal is now 123.

L'utilisation de guillemets est-elle le seul moyen d'aplatir le tableau afin que chaque élément soit stocké dans la valeur scalaire? Cela semble improbable, mais je n'ai trouvé aucune autre façon de procéder. Merci d'avance.

20
jozefg

La fonction join est couramment utilisée pour "aplatir" les listes. Vous permet de spécifier ce que vous voulez entre chaque élément de la chaîne résultante.

$scal = join(",", @arr);
# $scal is no "1,2,3"
41
Mat

Dans votre exemple, vous interpolez un tableau dans une chaîne entre guillemets doubles. Ce qui se passe dans ces circonstances est contrôlé par la variable $" De Perl. De perldoc perlvar :

$ LIST_SEPARATOR

$ "

Lorsqu'un tableau ou une tranche de tableau est interpolé dans une chaîne entre guillemets doubles ou dans un contexte similaire tel que /.../, ses éléments sont séparés par cette valeur. La valeur par défaut est un espace. Par exemple, ceci:

print "The array is: @array\n";

est équivalent à ceci:

print "The array is: " . join($", @array) . "\n";

Mnémonique: fonctionne dans un contexte entre guillemets.

La valeur par défaut de $" Est un espace. Vous pouvez évidemment changer la valeur de $".

{
  local $" = ':',
  my @arr = (1, 2, 3);
  my $scalar = "@arr"; # $scalar contains '1:2:3'
}

Comme pour toutes les variables spéciales de Perl, il est toujours préférable de localiser toutes les modifications dans un bloc de code.

17
Dave Cross

dans l'esprit de TIMTOWTDI:

my $scal;
$scal .= $_ foreach @arr;
5
plusplus

Vous pouvez également utiliser join sans séparateur

my $scalar = join( '' , @array ) ;

Il y a plus d'une façon de le faire.

5
dgw