Невозможно получить значения при цикле по массиву массивов - PullRequest
1 голос
/ 04 ноября 2011

Я создал массив примерно так:

while(@results = $execute->fetchrow())
{
  my $active = 'true';

  if($results[1] == 0)
  {
    $active = 'false';
  }

  my @campaign = ($results[0], $active);
  push(@campaign_names, @campaign);
}

Позже, когда мне нужно получить доступ к названию кампании (которое является первым элементом массива кампании), я не могу его извлечь. Какой правильный синтаксис?

foreach $campaign (@campaign_names)
{
  print ????;
}

Спасибо!

Ответы [ 2 ]

2 голосов
/ 04 ноября 2011

Проблема в том, что вы помещаете массив в конец @campaign_names, когда вам нужна ссылка на массив. Вот как бы я это написал:

while(@results = $execute->fetchrow())
{
  my $active = $results[1] ? 'true' : 'false';
  push @campaign_names, [ $results[0], $active ];
}

# later

foreach my $campaign( @campaign_names ) 
{ 
    my $name = $campaign->[0]; 
    my $active = $campaign->[1];
}

Я немного очистил его, используя троичное условное выражение (?:), чтобы выяснить значение $active. [ ... ] создает анонимную ссылку на массив (скаляр, указывающий на массив), который затем помещается в @campaign_names.

Когда мы зациклимся на них позже, следует отметить две важные вещи: мы используем my в переменной цикла, чтобы сохранить его локальным по отношению к блоку цикла, и что мы используем -> для разыменования элементов в указанном массиве. по ссылке на массив.

1 голос
/ 04 ноября 2011

Это не создание массива массивов. my @campaign = ($results[0], $active); push(@campaign_names, @campaign); выравнивает и толкает $results[0] и $active в массив @campaign_names. Вместо этого нажмите на arrayref:

  my @campaign = ($results[0], $active);
  push(@campaign_names, \@campaign);

или

  my $campaign = [$results[0], $active];
  push(@campaign_names, $campaign);

Массивы могут содержать только скалярные значения.

Вы захотите обращаться к perldsc по мере изучения (perldoc perldsc, http://perldoc.perl.org/perldsc.html)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...