2013-09-04 3 views
0

У меня есть код, подобный следующему:Perl: Создание новых переменных внутри цикла

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 }; 

Чтобы избежать повторения, я хочу пойти на петлю

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

Однако это приводит к синтаксической ошибке:

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

Что я здесь делаю неправильно?

+0

' "$ i.ubid"' -> '$ я "ubid" или' "$ {я} ubid" ' – KoVadim

+0

@KoVadim Благодарю. Я подозреваю, что $ player _. $ I.ubid также может быть в беде – ado

+5

Я думаю, вам следует изучить слово «массив». – KoVadim

ответ

4

Сначала вы должны написать $i."ubid" или "${i}ubid" вместо "$i.ubid".

И я хотел бы использовать хэш, как:.

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

Вы объявляете переменную не так, вы можете использовать хеш вместо нее.

Но если вы хотите достичь подобных же образом, сделать это таким образом

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

$$ создает переменные значения внутри переменный, так же, как в PHP.

+4

'$$ var' будет вызывать предупреждения, когда' use strict', правильно? И это [почти всегда плохая идея] (http://perl.plover.com/varvarname.html). Но я понимаю, что вы предоставили ему еще один способ решить проблему. – varnie

+0

Какова будет область переменных, созданных таким образом? – Samveen

+0

Если вы используете строгий, то это не очень хороший подход, потому что область этих переменных остается внутри цикла, а также строгая будет производить warings, когда мы будем использовать $$. – akashdeep

Смежные вопросы