2013-09-04 3 views
0

J'ai le code comme suit:Perl: Création de nouvelles variables dans une boucle

my $player_2ubid = grep { $_->ubid eq "2ubid" } @{$room_members }; 
my $player_3ubid = grep { $_->ubid eq "3ubid" } @{$room_members }; 
# .... 
my $player_11ubid = grep { $_->ubid eq "11ubid" } @{$room_members }; 

Pour éviter les répétitions, je veux aller pour une boucle

for my $i (2 .. 11){ 
my $player_.$i.ubid = grep { $_->ubid eq "$i.ubid" } @{$room_members }; 
} 

Cependant cela produit une erreur de syntaxe:

Can't modify concatenation (.) or string in scalar assignment at ***.t line 100, near "};" 

Qu'est-ce que je fais mal ici?

+0

' "$ i.ubid"' -> '$ i "uBid"' 'ou "$ {i} uBid"' – KoVadim

+0

@KoVadim Merci. Je soupçonne que $ player _. $ I.ubid peut aussi être en difficulté – ado

+5

Je pense, vous devriez étudier le mot "tableau". – KoVadim

Répondre

4

Vous devez d'abord écrire $i."ubid" ou "${i}ubid" au lieu de "$i.ubid".

Et j'utiliser un hachage comme:.

my %player_ubid; 
for my $i (2 .. 4){ 
    $player_ubid{$i} = grep { $_->ubid eq $i."ubid" } @{$room_members }; 
} 
1

Vous déclarez la variable dans le mauvais sens, vous pouvez utiliser le hash à la place.

Mais si vous voulez atteindre de la même façon, faites-le de cette façon

for my $i (2 .. 11){ 
    my $var = "player_".$i."ubid"; 
    $$var = grep { $_->ubid eq $i."ubid" } @{$room_members }; 
} 

$$ crée la variable de la valeur dans la variable, comme en php.

+4

'$$ var' produira des avertissements quand' use strict', n'est-ce pas? Et, c'est [presque toujours une mauvaise idée] (http://perl.plover.com/varvarname.html). Mais je comprends que vous l'avez fourni comme une autre façon de résoudre le problème. – varnie

+0

Quelle sera la portée des variables créées de cette façon? – Samveen

+0

Si vous utilisez strict alors ce n'est pas une bonne approche, car la portée de ces variables reste à l'intérieur de la boucle et aussi stricte produira des warings lorsque nous utilisons $$. – akashdeep

Questions connexes